将持久性添加到R​​EST应用程序错误

时间:2014-03-15 16:26:39

标签: 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] 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();
    }
}

这是我的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>

当我从普通类调用持久性功能时,它也会运行。但是当我想部署它时,我得到了错误。我正在使用TomEE作为应用程序服务器。

谢谢

1 个答案:

答案 0 :(得分:1)

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

最后,也许只需使用jta持久性单元并删除em.getTransaction调用。

附注:tomee附带openjpa,因此如果需要,您需要提供eclipselink