diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index ef5cfe1237..bd8fc132d0 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -497,7 +497,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { m.setAccessible(true); m.invoke(ecl, c); } - for (Class cc = c; cc != Object.class; cc = cc.getSuperclass()) { + for (Class cc = c; cc != Object.class && cc != null; cc = cc.getSuperclass()) { /** * See {@link com.google.inject.spi.InjectionPoint#getInjectionPoints(TypeLiteral, boolean, Errors)} */ diff --git a/test/src/test/java/hudson/ExtensionFinderTest.java b/test/src/test/java/hudson/ExtensionFinderTest.java index b323070128..ceba8f2de0 100644 --- a/test/src/test/java/hudson/ExtensionFinderTest.java +++ b/test/src/test/java/hudson/ExtensionFinderTest.java @@ -24,14 +24,17 @@ package hudson; import com.google.inject.AbstractModule; +import com.google.inject.ImplementedBy; import hudson.model.PageDecorator; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import javax.inject.Inject; import javax.inject.Qualifier; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestEnvironment; import org.jvnet.hudson.test.TestExtension; @@ -145,4 +148,18 @@ public class ExtensionFinderTest { @Inject A a; } + @Issue("JENKINS-60816") + @Test + public void injectInterface() { + assertThat(ExtensionList.lookupSingleton(X.class).xface, instanceOf(Impl.class)); + } + @TestExtension("injectInterface") + public static final class X { + @Inject + XFace xface; + } + @ImplementedBy(Impl.class) + public interface XFace {} + public static final class Impl implements XFace {} + }