Closed vorburger closed 10 years ago
If interested / useful, you should be able to reproduce the NPE above by checking out rev. f46e35c6964d4fb869bcd4b9230ebaf9d4d788ea of https://github.com/vorburger/mifosx, and running https://github.com/vorburger/mifosx/blob/f46e35c6964d4fb869bcd4b9230ebaf9d4d788ea/mifosng-provider/src/test/java/org/mifosplatform/boot/MifosSpringBootServerTest.java
The problem appears to be https://github.com/vorburger/mifosx/blob/f46e35c6964d4fb869bcd4b9230ebaf9d4d788ea/mifosng-provider/src/main/java/org/mifosplatform/MifosWithDBConfigurationCausingSpringBootNPE.java, note how that's a @Configuration which extends another @Configuration class... probably something not handled correctly there? If you replace @SpringApplicationConfiguration in MifosSpringBootServerTest by the MifosWithDBConfiguration instead of MifosWithDBConfigurationCausingSpringBootNPE, see https://github.com/vorburger/mifosx/blob/f46e35c6964d4fb869bcd4b9230ebaf9d4d788ea/mifosng-provider/src/main/java/org/mifosplatform/MifosWithDBConfiguration.java, then this NPE doesn't happen / it works.
It's very easy to reproduce:
@Configuration
@ComponentScan
public class Application extends BaseConfiguration {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
abstract class BaseConfiguration {
}
But feels like a bug in Spring to me. Let's wait and see what they say over here: https://jira.spring.io/browse/SPR-12059
I'll look into that SPR-12059 issue early next week.
@EnableAutoConfiguration
is not inherited so when we query its metadata, these are not found and we get a NPE in EnableAutoConfigurationImportSelector as the attributes
variable is null
.
I don't see any obvious method in AnnotationUtils
that would support such use case without @Inherited
so maybe we should add that to the annotation declaration instead?
Maybe @Inherited
is missing for a reason - it really doesn't make sense to have 2 classes with @EnableAutoConfiguration
in the same app. We could put some logic in the import selector to detect it, but how would it choose which one to use?
I suppose in the example above it would work because of the "abstract" base class. So we should add @Inherited
just to support that.
I am not sure how it's related to @Inherited
which is about to provide that annotation to sub-classes. You could have now two totally unrelated classes in the same app with @EnableAutoConfiguration
and this has nothing to do with @Inherited
. Am I missing something?
I just wanted to give a (late, sorry) confirmation that this what you did here worked for me, and say Thank you for having fixed this, and thereby supported Mifos - the open source Microfinance platform which helps end poverty one line of code at a time! ;-)
I've somehow managed to cause a NullPointerException: null at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.selectImports(EnableAutoConfigurationImportSelector.java:63)
Whatever the root cause of this may be, which could quite likely be a bug in my code/misunderstanding of how to use Spring (Boot), I'm hoping you'd agree that as an end-user I should never hit an NPE, but instead get a clearer exception?
Here is the full stack trace in case this is useful: