2014-10-17 174 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(); 
} 
相关问题