我使用spring-boot-starter-data-jpa创建了一个带有Spring Boot和JPA的POC,我的解决方案效果非常好。当我尝试将相同的解决方案添加到使用Spring 4和hibernate JPA 2.1版本的旧项目时,我的问题出现了。当我在weblogic中部署我的战争时,我得到的第一个错误是无法自动装配存储库所以我添加了@EnableJpaRepositories
。我甚至试图添加spring.datasource.jndi-name=EXAMPLE_Data_Source
,其中EXAMPLE_Data_Source
是我的weblogic数据源,但没有运气。
应用程序类:
@Configuration
@EnableWs
@ComponentScan("com.example.package")
@EnableJpaRepositories(basePackages = {"com.example.repository","com.example.entity"})
public class AppConfig extends WsConfigurerAdapter { //WsConfigurerAdapter is spring-ws-core 2.2.0 Release
@Autowire
MyRepository repository;
Repository类:
public interface MyRepository extends JpaRepository<EntityClass, EntityPKey> {
@Query("select c from EntityClass c where ID = :param1 and TYPE = :param2 and :param3 between FROM_DATE and TO_DATE ")
EntityClass entityClass(@Param("param1") int param1, @Param("param2")
char param2, @Param("param3") Date param3);
}
现在我得到以下错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined" weblogic.application.ModuleException:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
at weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:140)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:233)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:228)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:45)
Truncated. see log file for complete stacktrace
Caused By: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
Truncated. see log file for complete stacktrace
我必须让它处理在weblogic中部署的旧Spring项目。
问题1:这种解决我的问题的方式是适用于Spring框架还是仅适用于Springboot?
问题2:我缺少哪些配置?
问题3:请指出一个有效的例子。我正在努力使这项工作。
Spring webmvc和spring-tx是4.0.6版
请在解释中详细说明一下。我还很小。
提前致谢。
您必须配置Below Beans
DriverManagerDataSource
LocalContainerEntityManagerFactoryBean
JpaTransactionManager
请refer这个例子
我使用基于注释的配置,所以我使用以下配置在2天后解决了它:
@Bean
public DataSource jndiDataSource() {
final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
dsLookup.setResourceRef(true);
return dsLookup.getDataSource(dataSourceName); // where dataSourceName is your weblogic data source
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(jndiDataSource());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
factoryBean.setPackagesToScan("com.example.entity");
return factoryBean;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setShowSql(false);
hibernateJpaVendorAdapter.setGenerateDdl(true);
hibernateJpaVendorAdapter.setDatabase(Database.ORACLE);
return hibernateJpaVendorAdapter;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}