当前位置: 首页 > 知识库问答 >
问题:

SPRING BOOT访问entityManager

蒙勇
2023-03-14

我试图更新一个项目与Spring和Hibernate与春靴。

看起来一切正常,但我不知道如何获得entityManager。

我没有使用spring数据,所以没有使用域或存储库。

在这个项目中,服务用@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为空。所以我在文档中读到,如果我们想管理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());
    }

共有3个答案

宋臻
2023-03-14

OP解决方案。

最终实现了,不需要重新定义entityManager,只需添加获取@persistenceContext的bean(在spring boot 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();
}
申屠俊发
2023-03-14

尝试:

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

持续性。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");

然后输入:

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

这应该行得通。

敖毅
2023-03-14

您的EntityManager为null表示Spring没有在您的UserServiceImpl实例中处理PersistenceContext注释。

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

 类似资料:
  • 本文向大家介绍详解Springboot+React项目跨域访问问题,包括了详解Springboot+React项目跨域访问问题的使用技巧和注意事项,需要的朋友参考一下 一、开发环境 框架:springboot 1.5.10.RELEASE 开发工具:IDEA JDK:1.8 前端框架:React 15.6.1 浏览器:Chrome浏览器 二、跨域问题 本地使用ajax访问localhost:808

  • 本文向大家介绍SpringBoot配置web访问H2的方法,包括了SpringBoot配置web访问H2的方法的使用技巧和注意事项,需要的朋友参考一下 【前情提要】最近开始搭建博客,在本地调试的时候使用的数据库是h2,但是调试的时候需要查看数据库,本文也由此而来。 下面是我用到的方法: 使用IDEA的Database连接工具,具体操作方法就是按照要求配置连接url,用户名和密码即可。具体操作见下图

  • 尝试使用springboot MVC和Thymeleaf访问POST方法中的多个对象。 这是控制器。 下面是这些观点: patient.html 和result.html 和bean类是:PatientDataModel.java 另一个bean: 现在,问题是,我需要这两个bean在GET和POST方法中都可以访问。当我运行代码时,它正在执行,但是bean没有值,所有值都是空的。请建议

  • 本文向大家介绍SpringBoot文件访问映射如何实现,包括了SpringBoot文件访问映射如何实现的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringBoot文件访问映射如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过SpringBoot可以把磁盘内所有的文件都访问到 有一张图片存放在 E://images/a

  • tl;如果在Docker容器中运行,一个RestController正确回答,另一个则不正确。 该服务有两个API 和。 它们都是通过docker compose运行的。 返回。 返回一个空的200响应。正如预期的那样。 应该返回一个200响应和一个每次调用API时都会增加的数字。可悲的是,事实并非如此。 在本地运行该服务可以提供预期的结果。 maven spotify插件用于从以下创建图像。 我

  • 我在eclipse中初始化了一个SpringBoot Rest,并使其成为一个动态Web项目。遵循了三轮胎原则,并在控制器类中声明了endpointURL。项目部署良好,但一旦我尝试访问返回404错误的endpoint。请参阅下面的示例。二手编译器-Maven和服务器-apache tomcat 9.0 主类.java } 示例控制器类

  • 我正在从主类访问资源文件夹中的文件 我收到了这个错误: 我甚至打开了jar文件,remoteUnitsIdsInOldServer.txt文件就在那里,在类内部

  • 在尝试构建时,。我按照其他人的建议添加了,但仍然得到相同的错误。 有什么建议吗? pom.xml