Autowired-Eigenschaft ist null - Spring-Boot-Konfiguration
Ich bin stecken mit null-Werten in einem autowired-Eigenschaft. Ich hoffe ich konnte einigen helfen.
Verwenden wir für das Projekt spring-boot-version 0.5.0.M6.
Den vier Konfigurationsdateien mit Bohnen in einem Paket und sortiert werden, "area":
- Der Konfiguration der Datenquelle
- Global-method-security-Konfiguration (wie wir Frühling-ACL)
- MVC Konfiguration
- Spring Security-Konfiguration
Die main-Methode, die bootstraps alles ist in der folgenden Datei:
@EnableAspectJAutoProxy
@EnableSpringConfigured
@EnableAutoConfiguration(exclude = {
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
JpaRepositoriesAutoConfiguration.class,
SecurityAutoConfiguration.class,
ThymeleafAutoConfiguration.class,
ErrorMvcAutoConfiguration.class,
MessageSourceAutoConfiguration.class,
WebSocketAutoConfiguration.class
})
@Configuration
@ComponentScan
public class IntegrationsImcApplication {
public static void main(String[] args) throws Exception {
ApplicationContext ctx = SpringApplication.run(
IntegrationsImcApplication.c lass, args);
}
}
Die erste Datei enthält die Konfiguration der Datenquelle Bohnen ist wie folgt (die ich ausgelassen habe, eine Methode, die Körperteile, um Sie lesbarer zu machen):
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@Configuration
public class RootDataSourceConfig
extends TomcatDataSourceConfiguration
implements TransactionManagementConfigurer {
@Override
public DataSource dataSource() {
return jpaDataSource();
}
public PlatformTransactionManager annotationDrivenTransactionManager() {
return jpaTransactionManager();
}
@Bean
public HibernateExceptionTranslator hibernateExceptionTranslator() {
return new HibernateExceptionTranslator();
}
@Bean(name="jpaDataSource")
public DataSource jpaDataSource() {......}
@Bean(name = {"transactionManager","txMgr"})
public JpaTransactionManager jpaTransactionManager() {......}
@Bean(name = "entityManagerFactory")
public EntityManagerFactory jpaEmf() {......}
}
Und hier ist die nächste Konfiguration-Datei ist, das hängt von der Datenquelle von oben. Es hat etwa 20 Bohnen verwandt ACL-Konfiguration, aber es scheitert an der Premieren-bean, die Daten verwendet Quelle:
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class RootGlobalMethodSecurityConfig
extends GlobalMethodSecurityConfiguration
implements Ordered {
@Autowired
public DataSource dataSource;
@Override
public int getOrder() {
return IntegrationsImcApplication.ROOT_METHOD_SECURITY_CO NFIG_ORDER;
}
@Bean
public MutableAclService aclService()
throws CacheException, IOException {
MutableJdbcAclService aclService = new MutableJdbcAclService(
dataSource, aclLookupStrategy(), aclCache());
aclService.setClassIdentityQuery("SELECT @@IDENTITY");
aclService.setSidIdentityQuery("SELECT @@IDENTITY");
return aclService;
}
...................................
}
Grundsätzlich aufrufen aclService()
wirft einen Fehler wie dataSource
null ist. Wir haben versucht, die Bestellung der Konfigurationsdateien durch die Umsetzung der Ordered
- Schnittstelle. Wir haben auch versucht, mit @AutoConfigureAfter(RootDataSourceConfig.class)
aber das hat auch nicht geholfen. Anstatt das zu tun @Autowired
auf die DataSource
wir haben auch versucht, die Injektion der RootDataSourceConfig
Klasse selbst, aber es war immer noch null. Haben wir versucht, mit @DependsOn
und @Ordered
auf diese Bohnen aber wieder kein Erfolg. Wie es scheint, nichts kann injiziert werden in dieser Konfiguration.
Die Ausgabe der Konsole beim Systemstart ist die Auflistung der Bohnen in die Bestellung wir möchten Ihnen mit der Datenquelle als die erste. Wir sind ziemlich viel blockiert diese.
Ist es etwas, das seltsam oder einzigartig wir hier tun, das nicht funktioniert? Wenn dies wie vorgesehen, dann wie könnten wir injizieren Datenquelle anders?
Repo: github
- Möglicherweise gibt es einige code, den wir noch nicht gesehen haben, die dazu zwingt, früh die Instanziierung Ihrer
RootGlobalMethodSecurityConfig
. Könnten Sie teilen das gesamte Projekt bitte (z.B. auf github)? Es ist einfacher, um das ganze Bild zu sehen dann. - Einige Allgemeine Beobachtungen: 1) die Meisten der
@Order
und@DependsOn
Erklärungen sind wohl unnötig - der Frühling ist schlau genug, um herauszufinden, welche Abhängigkeiten in den meisten Fällen. 2)@EnableAspectJAutoProxy
redundant ist. 3) All jene ausschließt, die in der Autokonfiguration Erklärung sind wohl auch überflüssig und Sie sind auf jeden Fall störend. 4)@AutoConfigureAfter
gilt nur für die Autokonfiguration Klassen, und deine (nehme ich an) sind die normal-Komponente beans. - Dave, ich schob das Projekt auf github: link.
- Das Projekt startet mit
spring-boot 0.5.0.M5
ohne Fehler. Als M5 ist mitspring 4.0.0.M3
ich habe versucht mitspring-boot 0.5.0.M6 + spring 4.0.0.M3
, und der Start schlägt fehl. Aber es läuft ok mitspring-boot 0.5.0.M5 + spring 4.0.0.RELEASE
. - Es ist ein M7 können Sie versuchen (und auch Schnappschüsse). Wahrscheinlich einen Versuch Wert (ich kann bei Ihrem Projekt Aussehen auf morgen).
- Github-Projekt aktualisiert M7 aber dasselbe Problem wie mit der M6. Ich erstellte arbeiten M5 Zweig dort zu vergleichen. Vielen Dank für Ihr Interesse und Glückliches Neues Jahr!!!!!
- Ich kann nicht kommentieren, doch so, ich gepostet ein paar neue Informationen als Antwort. Ich schaffte es, um es zu arbeiten. Ich hoffe es ist der richtige Weg.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Begierig die Initialisierung einer bean-das hängt
DataSource
ist definitiv das problem. Die Ursache hat nichts zu tun mit Spring Boot oder Autokonfiguration, sondern plain old-fashioned-Huhn-und-ei - Methode Sicherheit angewendet wird, über einen Aspekt, der gewickelt ist, um Ihr Unternehmen Bohnen durch einBeanPostProcessor
. Ein bean kann nur nachbearbeitet werden, indem etwas, das initialisiert wird sehr früh. In diesem Fall ist es zu früh, um dieDataSource
injiziert (tatsächlich werden die@Configuration
Klasse, die braucht dieDataSource
instanziiert wird zu früh umgebrochen werden, richtig in der@Configuration
verarbeitenden Maschinen, so dass Sie nicht autowired). Mein Vorschlag (die bekommt man nur an den gleichen Punkt mit den fehlendenAuthenticationManager
) ist zu erklären, dass dieGlobalMethodSecurityConfiguration
als geschachtelte Klasse anstelle der einen, dieDataSource
wird benötigt:}
D. H. bleiben, dass im inneren der
RootMethodSecurityConfiguration
und entfernen Sie die@EnableGlobalMethodSecurity
annotation von dieser Klasse.@PreAuthorize
und@Transactional
Hinzugefügt von entity-und repository.Könnte ich das problem gelöst haben.
GlobalMethodSecurityConfiguration.class
hat die folgenden setter, der versucht, autowire Erlaubnis Bewerter:Und in meinem Fall die
aclPermissionEvaluator()
bean mussaclService()
bean, die wiederum von einem anderen abhängt autowired-Eigenschaft:dataSource
. Das scheint nicht zu autowired noch.Dieses Problem zu beheben, das ich umgesetzt habe
BeanFactoryAware
und bekommendataSource
ausbeanFactory
statt:Danach weitere Ausnahme zeigte sich, wo
SecurityAutoConfiguration.class
beschwert sich über fehlende AuthenticationManager, so dass ich nur ausgeschlossen es aus@EnableAutoConfiguration
. Ich bin nicht sicher, ob seine ideale, aber ich habe benutzerdefinierte Sicherheitskonfiguration, so wird auf diese Weise funktioniert alles ok.