Web services 向REST应用程序错误添加持久性

Web services 向REST应用程序错误添加持久性,web-services,rest,persistence,Web Services,Rest,Persistence,如何在REST应用程序中使用持久性? 我想使用@Inject和@PersistenceUnit注释来实例化我需要的PersistencyManager对象, 当我调用REST服务的持久性功能时,我得到一个错误: [2014-03-15 05:05:45,472] Artifact CubieboardGPIO:war: Error during artifact deployment. See server log for details. [2014-03-15 05:05:45,473] A

如何在REST应用程序中使用持久性? 我想使用@Inject和@PersistenceUnit注释来实例化我需要的PersistencyManager对象, 当我调用REST服务的持久性功能时,我得到一个错误:

[2014-03-15 05:05:45,472] Artifact CubieboardGPIO:war: Error during artifact deployment. See server log for details.
[2014-03-15 05:05:45,473] Artifact CubieboardGPIO:war: javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: 
org.apache.openejb.OpenEJBRuntimeException: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/]]
这是我的休息:

@Inject
private PersistenceManager persistenceManager;

@GET
@Path("/activate")
public String activate(@QueryParam("pin") int pin) {
    persistenceManager = new PersistenceManager();
    // URI : /cubieboard/gpio/activate?pin=67
    String[] messages = _activate(pin);
    StringBuilder sb = new StringBuilder();
    sb.append(ConfigurationManager.getConfiguration("ACTIVATE_MESSAGE")+"\n");
    sb.append("Persistence:\t");        sb.append(messages[0]);     sb.append("\n");
    sb.append("Terminal Response:\t");  sb.append(messages[1]);     sb.append("\n");
    return sb.toString();
}
这是PersisteneManager:

    @Stateless
public class PersistenceManager {

    @PersistenceUnit(name = "cubieDB")
    private static EntityManagerFactory factory;
    private EntityManager em;

    public PersistenceManager(){
     //   factory = Persistence.createEntityManagerFactory(ConfigurationManager.getConfiguration("PERSISTENCE_UNIT_NAME"));
//        factory = Persistence.createEntityManagerFactory("cubieDB");
        em = factory.createEntityManager();
    }

    public List<Operation> getAllOperations() {
        Query q = em.createQuery("SELECT op FROM Operation op");
        List<Operation> ops = q.getResultList();
        return ops;
    }

    public void persist(Operation operation) {
        em.getTransaction().begin();
        em.persist(operation);
        em.getTransaction().commit();
    }

    public void deleteAll(){
        em.getTransaction().begin();
        Query q = em.createNativeQuery("DELETE FROM Operation");
        q.executeUpdate();
        em.getTransaction().commit();
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        em.close();
    }
}
@无状态
公共类持久性管理器{
@PersistenceUnit(name=“cubieDB”)
私营静态实体管理工厂;
私人实体管理者;
公共持久性管理器(){
//factory=Persistence.createEntityManagerFactory(ConfigurationManager.getConfiguration(“Persistence\u UNIT\u NAME”);
//factory=Persistence.createEntityManagerFactory(“cubieDB”);
em=factory.createEntityManager();
}
公共列表getAllOperations(){
Query q=em.createQuery(“从操作op中选择op”);
List ops=q.getResultList();
返回操作;
}
公共作废持久化(操作){
em.getTransaction().begin();
em.persist(操作);
em.getTransaction().commit();
}
public void deleteAll(){
em.getTransaction().begin();
Query q=em.createNativeQuery(“从操作中删除”);
q、 executeUpdate();
em.getTransaction().commit();
}
@凌驾
受保护的void finalize()抛出可丢弃的{
super.finalize();
em.close();
}
}
这是我的persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="cubieDB" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.sakhoshdel.cubieboard.gpio.persistence.Operation</class>
        <properties>
            <!--<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>-->
            <property name="eclipselink.ddl-generation" value="create-tables"/>
            <!--<property name="javax.persistence.schema-generation-action" value="drop-and-create"/>-->
            <!--<property name="javax.persistence.schema-generation-target" value="database-and-scripts"/>-->
            <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:derby:cubieDB;create=true" />
        </properties>
    </persistence-unit>

</persistence>

org.eclipse.persistence.jpa.PersistenceProvider
com.sakhoshdel.cubieboard.gpio.persistence.Operation
当我从一个普通类调用持久性功能时,它也会运行。但当我想要部署它时,我会得到一个错误。我正在使用TomEE作为应用服务器


谢谢

不应该使用ejb构造函数(在最新版本中甚至不应该调用)。也不建议注入静电场

最后,可能只是使用一个jta持久化单元并删除em.getTransaction调用

旁注:tomee附带了openjpa,所以如果需要,您需要提供eclipselink