java-JPA EntityManager注入失败

java-JPA EntityManager注入失败,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我正在努力完成我的家庭作业,其中我必须用Spring构建一个Restful Web服务。此外,我使用JPA(Eclipselink)编辑、搜索和显示数据库条目 我的persistence.xml如下所示 <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <persistence-un

我正在努力完成我的家庭作业,其中我必须用Spring构建一个Restful Web服务。此外,我使用JPA(Eclipselink)编辑、搜索和显示数据库条目

我的persistence.xml如下所示

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="test">
        <class>at.test.entities.UserEntity</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://myserver:3306/somedatabase"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="xxx"/>
            <property name="javax.persistence.jdbc.password" value="xxx"/>
        </properties>
    </persistence-unit>
</persistence>
它工作得很好,但是如果我想通过
@PersistenceContext
注释来完成它的话

@PersistenceContext(unitName = "test")
private EntityManager entityManager;
它因以下stacktrace而失败:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestHandler': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'test' is defined
工作原理:

@RestController
@RequestMapping(value = "/users")
public class RequestHandler {
    private EntityManager entityManager;

    @RequestMapping(value = "/test", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<UserTest> test(@RequestParam(value = "asd", defaultValue = "") String name) {
        /* works just fine */
        entityManager = Persistence.createEntityManagerFactory("test").createEntityManager();

        /* Some test stuff */
        UserTest user = entityManager.find(UserTest.class, 1);
        entityManager.getTransaction().begin();
        entityManager.persist(new UserTest("ASDASD", "ASDASdjnwco2eno2oc"));
        entityManager.getTransaction().commit();
        return new ResponseEntity<UserTest>(user, HttpStatus.CREATED);
    }
}
@RestController
@请求映射(value=“/users”)
公共类RequestHandler{
私人实体管理者实体管理者;
@RequestMapping(value=“/test”,method=RequestMethod.GET,products=“application/json”)
公共响应性测试(@RequestParam(value=“asd”,defaultValue=”“)字符串名){
/*很好用*/
entityManager=Persistence.createEntityManager工厂(“测试”).createEntityManager();
/*一些测试材料*/
UserTest user=entityManager.find(UserTest.class,1);
entityManager.getTransaction().begin();
persist(新用户测试(“ASDASD”、“ASDASdjnwco2eno2oc”);
entityManager.getTransaction().commit();
返回新的响应属性(用户,HttpStatus.CREATED);
}
}
它如何不起作用:

@RestController
@RequestMapping(value = "/users")
public class RequestHandler {
    /* Does not work */
    @PersistenceContext(unitName = "test")
    private EntityManager entityManager;

    @RequestMapping(value = "/test", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<UserTest> test(@RequestParam(value = "asd", defaultValue = "") String name) {
        /* Some test stuff */
        UserTest user = entityManager.find(UserTest.class, 1);
        entityManager.getTransaction().begin();
        entityManager.persist(new UserTest("ASDASD", "ASDASdjnwco2eno2oc"));
        entityManager.getTransaction().commit();
        return new ResponseEntity<UserTest>(user, HttpStatus.CREATED);
    }
}
@RestController
@请求映射(value=“/users”)
公共类RequestHandler{
/*不起作用*/
@PersistenceContext(unitName=“test”)
私人实体管理者实体管理者;
@RequestMapping(value=“/test”,method=RequestMethod.GET,products=“application/json”)
公共响应性测试(@RequestParam(value=“asd”,defaultValue=”“)字符串名){
/*一些测试材料*/
UserTest user=entityManager.find(UserTest.class,1);
entityManager.getTransaction().begin();
persist(新用户测试(“ASDASD”、“ASDASdjnwco2eno2oc”);
entityManager.getTransaction().commit();
返回新的响应属性(用户,HttpStatus.CREATED);
}
}
谢谢你的帮助

解决方案

AdrianDuta和Branislav Lazic提出的两种解决方案都有效。您可以通过XML文件定义bean和持久化单元,也可以根据Java类配置它们

尽管我现在使用了此模板/示例:


使用
@PersistenceContext
EntityManager
bean注入rest控制器。要使其工作,您可以定义


在应用程序上下文中定义:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="test" />
</bean>



<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

能否粘贴Spring JPA配置?
@Bean(name = "test")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        // configuration here
}
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="test" />
</bean>



<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />