Gewusst wie: abrufen von JNDI mit Spring @ - Konfiguration anstelle der XML-Konfiguration
Habe ich begonnen, die Entwicklung eines neuen Frühjahr 3.2.4 Anwendung und bin versucht, die Java-basierte Konfiguration anstelle von XML-Dateien, wie ich in der Vergangenheit verwendet haben. Ich bin jedoch Probleme bei der Umstellung.
Verwendung von XML, würde ich es code wie folgt:
<!-- application datasource -->
<bean id="dataSource.jndi" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton" lazy-init="true">
<property name="jndiName" value="java:comp/env/jdbc/liment" />
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit"/>
<property name="dataSource" ref="dataSource.jndi"/>
</bean>
Allerdings bin ich sehr viel stecken versuchen, herauszufinden, wie man dies in Java. Ich bin versucht, zu replizieren die Konfiguration, aber läuft in Schwierigkeiten:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages={"com.ia"})
public class AppConfigJPA {
@Bean
public DataSource dataSource() {
//configure and return the necessary JDBC DataSource
JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean();
dataSource.setJndiName("java:comp/env/jdbc/liment");
try {
dataSource.afterPropertiesSet();
} catch (IllegalArgumentException | NamingException e) {
//rethrow
throw new RuntimeException(e);
}
return (DataSource)dataSource.getObject();
}
@Bean
public EntityManagerFactory entityManagerFactory(){
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setPersistenceUnitName("persistenceUnit");
emf.setDataSource(dataSource());
emf.afterPropertiesSet
return emf.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory());
}
}
Allerdings bekomme ich folgende Fehlermeldung:
Caused by: java.lang.IllegalStateException: No persistence exception translators found in bean factory. Cannot perform exception translation.
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:142)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.setBeanFactory(PersistenceExceptionTranslationInterceptor.java:117)
at org.springframework.data.repository.core.support.PersistenceExceptionTranslationRepositoryProxyPostProcessor.<init>(PersistenceExceptionTranslationRepositoryProxyPostProcessor.java:44)
at org.springframework.data.repository.core.support.TransactionalRepositoryFactoryBeanSupport.setBeanFactory(TransactionalRepositoryFactoryBeanSupport.java:85)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1502)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1470)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
... 33 more
Was ich bin fehlt oder falsch??
BEARBEITEN
Folgende @SotiriosDelimanolis Antwort, ich habe meine modifizierten code, um das folgende zu Lesen:
@Autowired DataSource dataSource;
@Autowired EntityManagerFactory entityManagerFactory;
@Bean
public JndiObjectFactoryBean dataSource() {
//configure and return the necessary JDBC DataSource
JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean();
dataSource.setJndiName("java:comp/env/jdbc/josak");
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(){
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setPersistenceUnitName("persistenceUnit");
emf.setDataSource(dataSource);
return emf;
}
@Bean
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory);
}
Aber bin immer Autowired Ausnahmen statt jetzt:
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: javax.sql.DataSource com.ia.system.configuration.AppConfigJPA.dataSource; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
... 31 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:988)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:858)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:770)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
... 33 more
dataSource.getObject();
ist null
? Das sollte nicht passieren, wenn Sie aufgerufen afterPropertiesSet()
. Und poste bitte die mehr stack-trace.Eigentlich habe ich gerade erwischt ein Fehler im code, bevor ich sah Ihren Kommentar. Ich hatte vergessen, ein "afterPropertiesSet ()" - Aufruf in der entityManagerFactory(). Aber jetzt, bekomme ich eine andere Ausnahme im Hinblick auf eine Persistenz Ausnahme übersetzer.
InformationsquelleAutor Eric B. | 2013-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
entnehmen Sie bitte untenstehenden link -
http://forum.spring.io/forum/spring-projects/container/724356-how-to-use-javaconfig-to-declare-a-jndi-datasource
die datasource erstellt werden müssen, wie dies -
setResourceRef
ist nicht notwendig in diesem Kontext als JndiDataSourceLookup setzt ihn auf true. Der code ist einfachnew JndiDataSourceLookup().getDataSource("jdbc/yourJdbcGoesHere")
InformationsquelleAutor Raj
Dies ist eine seltsame design (für
PersistenceExceptionTranslator
), dass ich nicht sofort verstehen, aber hier ist die Lösung.Ihre
LocalContainerEntityManagerFactoryBean
ist einFactoryBean
aber auch einPersistenceExceptionTranslator
(implementiert). Aber Sie sind nicht setzen dieLocalContainerEntityManagerFactoryBean
in Ihrem Kontext, Sie sind nur immer seine Sache.Statt
tun
Frühjahr kümmern aufrufen
afterPropertiesSet()
undgetObject()
zu legenEntityManagerFactory
Bohne in dem Zusammenhang.Grundsätzlich, wenn Sie am Ende mit zwei Bohnen, eine
EntityManagerFactory
und einLocalContainerEntityManagerFactoryBean
. Ihre JPA-Konfiguration erfordert einePersistenceExceptionTranslator
Bohne in dem Zusammenhang. Das wird damit zufrieden sein, dassLocalContainerEntityManagerFactoryBean
.FYI, Sie können das gleiche tun für Ihre
JndiObjectFactoryBean
oder andereFactoryBean
.Der Frühling ist die Magie Weg. Es proxies die
@Bean
Methode Aufrufe und gibt dieFactoryBean
erstellt bean anstelle desFactoryBean
selbst.Ich verstehe es nicht. Rücksendung der factory bean macht der compiler beschweren sich über
return new JpaTransactionManager(entityManagerFactory())
:The constructor JpaTransactionManager(LocalContainerEntityManagerFactoryBean) is undefined
Oh, dass. Mein schlechtes. Ein workaround ist
@Autowired
Bohnen der Art des Objekts IhreFactoryBean
Bohnen erstellen in einigen@Configuration
Klasse Felder. Dann verwenden Sie anstelle von aufrufen, die Ihre jeweiligen Methoden.Das scheint mir sehr kompliziert. Kannst du ein Beispiel bitte? Ich habe versucht, was Sie vorgeschlagen, aber offensichtlich mache etwas falsch, wie ich immer bin, NoSuchBeanDefnExceptions wenn es versucht, autowire meine DataSource-bean. Ich bin der Bearbeitung der oben genannten Frage zu post meinen neuen code und exception
InformationsquelleAutor Sotirios Delimanolis