2015-06-15 27 views
0

我對spring不太熟悉,所以加入了和spring有關的所有東西。spring 4 struts 1.x混合xml和java config

我有一個spring 4 struts 1.x應用程序。

Spring上下文是用struts插件,它指向spring-context.xml

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> 
    <set-property property="contextConfigLocation" 
    value="/WEB-INF/spring-context.xml"/> 
</plug-in> 

spring-context.xml我已經配置加載JPA的EntityManager像這樣:

<context:component-scan base-package="com.epam.testsystem" /> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="primary"/> 
    </bean> 
    <!-- Transactions --> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

我也有Spring Security的綜合使用

public class SecurityWebApplicationInitializer 
     extends AbstractSecurityWebApplicationInitializer { 

    public SecurityWebApplicationInitializer() { 
     super(SecurityConfig.class); 
    } 
} 

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true) 
@ImportResource("/WEB-INF/spring-context.xml") 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
        .antMatchers("/welcome.do").hasRole("ADMIN") 
        .and() 
       .formLogin() 
        .loginPage("/login.do") 
        .loginProcessingUrl("/login") 
        .failureUrl("/login?error=1") 
        .permitAll() 
        .and() 
       .csrf(); 
    } 

    @Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 
} 

並且它工作沒有錯誤。

現在我決定將EntityManager的配置移動到java配置。所以我刪除bean定義從spring-context.xml加入這些豆子SecurityConfig

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setPersistenceUnitName("primary"); 
    return em; 
} 

@Bean 
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){ 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf); 
    return transactionManager; 
} 

但現在我得到這個異常:

造成的:org.springframework.beans.factory.BeanCurrentlyInCreationException:錯誤名稱創建豆「的entityManagerFactory 「:請求豆目前正處於創作:是否有一個無法解決的循環引用「

我認爲發生的事情,因爲我在UserDaoImpl使用@PersistenceContext註解,我之前導入到Java的配置

那麼最簡單的方法是什麼呢?

感謝

回答

0

一所提出的解決方案是

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 

    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setPersistenceUnitName("primary"); 
    return em; 
} 

    @Bean 
    public PlatformTransactionManager transactionManager(){ 

     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
               // SOlution below 
     transactionManager.setEntityManagerFactory(entityManagerFactory()); 
     return transactionManager; 
    } 

在這裏,我們通過的entityManagerFactory() 通過依賴bean時請讓我知道,如果這滿足瞭解決方案

0

我做了它的工作通過創建單獨的PersistenceConfig

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages="com.epam.testsystem.repository") 
public class PersistenceConfig { 
    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setPersistenceUnitName("primary"); 
     return em; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf){ 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 
     return transactionManager; 
    } 
} 

並將Java Config導入到xml配置(spring-context.xml):

<bean class="com.epam.testsystem.config.PersistenceConfig" />