2014-10-17 173 views
1

我試圖用springboot更新一個使用spring和hibernate進行的項目。SPRING BOOT訪問entityManager

一切似乎沒問題,但我不知道如何獲得entityManager。

我沒有使用彈簧數據,所以沒有使用域和存儲庫。

在這個項目中,服務都標註有@Service和EntityManager的是自動裝配有:@PersistenceContext,

這裏我的服務

@Service 
@Transactional 
public class UserServiceImpl implements UserDetailsService, UserService { 

@PersistenceContext 
EntityManager entityManager; 


/** 
* 
*/ 
private static final long serialVersionUID = 6384460058124202695L; 

public UserDetails loadUserByUsername(String username) 
     throws UsernameNotFoundException, DataAccessException { 
    User user = entityManager.find(User.class, username); 
    return user; 
} 

的例子這裏的問題是,實體管理器爲空。所以,我在文檔閱讀,如果我們要管理的EntityManager我們必須配置它,所以我做了這個配置文件:

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { 
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
em.setDataSource(dataSource()); 
em.setPackagesToScan(new String[] { "services" }); 

JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
em.setJpaVendorAdapter(vendorAdapter); 
em.setJpaProperties(additionalProperties()); 

return em; 

}

應用程序被啓動,但仍然有EntityManager的空。

任何線索?

謝謝。

編輯:加入我的應用程序類(有它的一個示範項目,我把所有的配置在一個文件中)

@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
@EnableWebMvcSecurity 
public class Application extends WebSecurityConfigurerAdapter{ 

@Value("${sec.cas.server}") 
private String casServer; 

@Value("${sec.app.server}") 
private String appServer; 

@Value("${spring.datasource.driverClassName}") 
private String databaseDriverClassName; 

@Value("${spring.datasource.url}") 
private String databaseUrl; 

@Value("${spring.datasource.username}") 
private String databaseUsername; 

@Value("${spring.datasource.password}") 
private String databasePassword; 

public static void main(String[] args) { 
    ApplicationContext ctx = SpringApplication.run(Application.class, args); 

    System.out.println("Let's inspect the beans provided by Spring Boot:"); 

    String[] beanNames = ctx.getBeanDefinitionNames(); 
    Arrays.sort(beanNames); 
    for (String beanName : beanNames) { 
     System.out.println(beanName); 
    } 
} 

@Bean 
public ComboPooledDataSource dataSource() { 
    ComboPooledDataSource datasource = new ComboPooledDataSource(); 
    try { 
     datasource.setDriverClass(databaseDriverClassName); 
    } catch (PropertyVetoException e) { 
     throw new IllegalArgumentException("Wrong driver class"); 
    } 
    datasource.setJdbcUrl(databaseUrl); 
    datasource.setUser(databaseUsername); 
    datasource.setPassword(databasePassword); 

    datasource.setAcquireIncrement(1); 
    datasource.setIdleConnectionTestPeriod(600); 
    datasource.setMaxPoolSize(500); 
    datasource.setMinPoolSize(50); 
    datasource.setMaxStatements(0); 

    datasource.setMaxConnectionAge(600); 
    datasource.setMaxIdleTime(600); 

    return datasource; 
} 



@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { 
    DefaultPersistenceUnitManager unitManager = new DefaultPersistenceUnitManager(); 
    unitManager.setDefaultDataSource(dataSource()); 
    unitManager.setPersistenceXmlLocations("classpath*:META-INF/persistence.xml"); //location of  your persistence.xml file 
    unitManager.setPackagesToScan(new String[] { "services" }); 
    unitManager.setDefaultPersistenceUnitName("entityManager"); 

    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
    em.setPersistenceUnitManager(unitManager); 

    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
    em.setJpaVendorAdapter(vendorAdapter); 
    em.setJpaProperties(additionalProperties()); 

    return em; 
} 

Properties additionalProperties() { 
    Properties properties = new Properties(); 
    properties.setProperty("hibernate.show_sql", "false"); 
    properties.setProperty("hibernate.format_sql", "true"); 
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle9iDialect"); 
    return properties; 
} 

    @Bean 
    public JdbcDaoImpl jdbcUserService() { 
     JdbcDaoImpl jdbcDaoImpl = new JdbcDaoImpl(); 
     jdbcDaoImpl.setEnableGroups(true); 
     jdbcDaoImpl.setEnableAuthorities(true); 
     jdbcDaoImpl.setDataSource(dataSource()); 
     return jdbcDaoImpl; 
    } 

    @Bean 
    public ServiceProperties serviceProperties() { 
     ServiceProperties serviceProperties = new ServiceProperties(); 
     serviceProperties.setService("http://"+appServer+"/j_spring_cas_security_check"); 
     serviceProperties.setSendRenew(false); 
     return serviceProperties; 
    } 

    @Bean 
    public CasAuthenticationProvider casAuthenticationProvider() { 
     CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider(); 
      casAuthenticationProvider.setAuthenticationUserDetailsService(authenticationUserDetailsService()); 
     casAuthenticationProvider.setUserDetailsService(new UserServiceImpl()); 
     //casAuthenticationProvider.setAuthenticationUserDetailsService(userServiceImpl.class); 
     casAuthenticationProvider.setServiceProperties(serviceProperties()); 
     casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator()); 
     casAuthenticationProvider.setKey("an_id_for_this_auth_provider_only"); 
     return casAuthenticationProvider; 
    } 

    @Bean 
    public UserDetailsByNameServiceWrapper authenticationUserDetailsService() { 
     UserDetailsByNameServiceWrapper userDetailsByName = new UserDetailsByNameServiceWrapper(); 
     userDetailsByName.setUserDetailsService(jdbcUserService()); 
     return userDetailsByName; 
    } 

    @Bean 
    public Cas20ServiceTicketValidator cas20ServiceTicketValidator() { 
     Cas20ServiceTicketValidator casServiceTicketValidator = new Cas20ServiceTicketValidator("https://"+casServer+"/cas"); 
     casServiceTicketValidator.setProxyCallbackUrl("http://"+appServer+"/"); 
     casServiceTicketValidator.setProxyGrantingTicketStorage(new ProxyGrantingTicketStorageImpl()); 
     return casServiceTicketValidator; 
    } 

    @Bean 
    public CasAuthenticationFilter casAuthenticationFilter() throws Exception { 
     CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter(); 
     casAuthenticationFilter.setAuthenticationManager(authenticationManager()); 
     casAuthenticationFilter.setAuthenticationSuccessHandler(new SavedRequestAwareAuthenticationSuccessHandler()); 
     casAuthenticationFilter.setProxyGrantingTicketStorage(new ProxyGrantingTicketStorageImpl()); 
     casAuthenticationFilter.setProxyReceptorUrl("/secure/receptor"); 
     return casAuthenticationFilter; 
    } 

    @Bean 
    public CasAuthenticationEntryPoint casAuthenticationEntryPoint() { 
     CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint(); 
     casAuthenticationEntryPoint.setLoginUrl("https://"+casServer+"/cas/login"); 
     casAuthenticationEntryPoint.setServiceProperties(serviceProperties()); 
     return casAuthenticationEntryPoint; 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .addFilter(casAuthenticationFilter()); 
     http 
      .exceptionHandling() 
       .authenticationEntryPoint(casAuthenticationEntryPoint()); 
     http 
     .authorizeRequests() 
      .antMatchers("/", "/home").authenticated() 
      .anyRequest().authenticated(); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .authenticationProvider(casAuthenticationProvider()); 
    } 
+0

這將是很好看你的主應用程序類的樣子,因爲使用Spring啓動 – geoand 2014-10-18 16:03:56

+0

您正在你確定了'UserServiceImpl'的實例由春天管理?一般來說,如果它是空的,它不會被Spring管理,如果Spring不能自動連接依賴項,它會拋出一個異常。 – 2014-10-19 18:21:56

+0

我已將我的應用程序類放在主線程中。我認爲UserServiceImpl管理得當。當應用程序啓動時,我可以在loadUserByUsername方法中放置一個斷點,當應用程序到達此處時,我可以看到此時entityManager爲空。 – partyboy 2014-10-20 07:41:31

回答

0

嘗試:

DefaultPersistenceUnitManager unitManager = new DefaultPersistenceUnitManager(); 
    unitManager.setPersistenceXmlLocations("classpath*:META-INF/persistence.xml"); //location of your persistence.xml file. 
    unitManager.setDefaultDataSource(dataSource); 

persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 

    <persistence-unit name="entityManager" transaction-type="RESOURCE_LOCAL"> 
     //classes, etc... 
    </persistence-unit> 

</persistence> 

和:

LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
em.setPersistenceUnitManager(unitManager); 
em.setPersistenceUnitName("entityManager"); 

然後injet:

@PersistenceContext(unitName = "entityManager") 
private EntityManager entityManager; 

這應該工作。

+0

感謝您的快速響應,我開始實施您的解決方案。出現錯誤,在persistence.xml中找不到持久性單元...我認爲應用程序在我的類路徑中找不到我的persistence.xml。我會在星期一繼續發現。 – partyboy 2014-10-17 14:41:00

+0

我試圖配置這種方式,但我總是得到錯誤:o名稱爲'entityManager'的持久性單元找到 persistence.xml位於類路徑中(查看部署的應用程序,類/ META-INF中的文件) – partyboy 2014-10-20 10:08:46

0

您的EntityManagernull表示Spring未在您的UserServiceImpl實例中處理@PersistenceContext註釋。

您正在創建UserServiceImpl的實例,作爲配置您的CasAuthenticationProvider bean的一部分。這意味着Spring對這個實例一無所知,並且不會注入任何它的依賴關係。您需要使用Spring創建的實例,例如將其作爲casAuthenticationProvider()方法的參數。

+0

感謝您的回覆安迪, 所以我分開我的配置文件:一個用於Websecurity和數據源,並在主應用程序類中添加persistenceBeanPostProcessor。 不幸的是我仍然有問題。 使用新添加的bean,我還需要配置自己的entityManager(覆蓋spring boot auto config)嗎? – partyboy 2014-10-20 10:01:24

+0

您不需要手動配置實體管理器。另請參閱我的更新。我剛剛注意到你正在手動創建一個UserServiceImpl的實例。 – 2014-10-20 10:20:36

+0

UserServiceImpl的好處! 因此,我嘗試在配置文件中注入@Autowired的服務,但似乎沒有工作......所以在casAuthenticationProvider()方法中,我只是以這種方式獲取bean: Autowired ApplicationContext context; Bean public CasAuthenticationProvider casAuthenticationProvider(){... UserServiceImpl userServiceImpl =(UserServiceImpl)this.context.getBean(「userServiceImpl」); 現在我進入方法loadUserByUsername與entityManager不爲null! 現在出現了一個新問題:實體沒有綁定,正在尋求解決 – partyboy 2014-10-20 14:03:07

0

解決方案由OP。

得到它最後的工作,沒有entityManager需要重新定義,只需添加獲取@persistenceContext的bean(在spring引導1.2之前。0)

這裏是我的應用程序上下文:

@Configuration 
@ComponentScan(basePackages={"services","model"}) 
@EnableAutoConfiguration 
public class Application { 

public static void main(String[] args) { 
    ApplicationContext ctx = SpringApplication.run(Application.class, args); 
} 

@Bean 
public PersistenceAnnotationBeanPostProcessor persistenceBeanPostProcessor() { 
    return new PersistenceAnnotationBeanPostProcessor(); 
} 
相關問題