对实体管理器的SPRING BOOT访问 [英] SPRING BOOT access to entityManager

查看:76
本文介绍了对实体管理器的SPRING BOOT访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试更新一个使用spring进行的项目,并使用springboot进行休眠.

I'm trying to update a project made with spring and hibernate with springboot.

一切似乎都还可以,但是我不知道如何获得entityManager.

Everything seems ok, but I can't figure how to get the entityManager.

我不使用spring数据,因此不使用域或存储库.

I'm not using spring data, so no domain nor repository is used.

在此项目中,服务使用@service进行注释,而EntityManager使用以下方法自动装配:@PersistenceContext,

In this project, services are annotated with @service and entityManager is autowire with: @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为空.因此,我在文档中读到,如果要管理entityManager,必须对其进行配置,所以我在配置文件中进行了此操作:

The problem here is that the entityManager is null. So I read in doc that if we want to manage the entityManager we have to configure it, so I did this in configuration file:

@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为null.

The application is launching, but still have the entityManager null.

有任何线索吗?

添加我的应用程序类(这是一个演示项目,我将所有配置都放在一个文件中)

adding my application class (Has it's a demo project, I put all the config in one file)

@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());
    }

推荐答案

您的EntityManagernull表示Spring不在您的UserServiceImpl实例中处理@PersistenceContext批注.

Your EntityManager being null indicates that Spring isn't processing @PersistenceContext annotations in your UserServiceImpl instance.

作为配置CasAuthenticationProvider bean的一部分,您正在手动创建UserServiceImpl的实例.这意味着Spring对实例一无所知,并且不会注入其任何依赖项.您需要使用Spring创建的实例,例如,将其作为casAuthenticationProvider()方法的参数.

You're creating an instance of UserServiceImpl manually as part of configuring your CasAuthenticationProvider bean. That means that Spring knows nothing about the instance and will not inject any of its dependencies. You need to use a Spring-created instance, for example by making it an argument of the casAuthenticationProvider() method.

这篇关于对实体管理器的SPRING BOOT访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆