【发布时间】:2014-02-26 22:08:39
【问题描述】:
我正在编写一个部署在 glassfish 4 上的小型 EJB3 应用程序,并使用 glassfish 附带的 derbyDB。
为了简化测试,我将我的一个 EJB 声明为 @Webservice,以便我可以使用 glassfish 提供的测试器触发一个方法。到目前为止一切顺利。
调用栈是这样的: DailyReportingJob(@Stateless 和 @WebService,我测试的入口点) --> VerfahrensArchivService(@Stateless 和 @Transactional(value = TxType.REQUIRES_NEW))
我的 persistence.xml 是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
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">
<persistence-unit name="zvagent">
<jta-data-source>jdbc/zvagentdb</jta-data-source>
<class>de.kevinfleischer.zvagent.verfahren.Verfahren</class>
<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="eclipselink.deploy-on-startup" value="true"/>
</properties>
</persistence-unit>
</persistence>
我在 glassfish 中配置了一个资源类型为 javax.sql.DataSource 的连接池和一个名为 jdbc/zvagentdb 的 jdbc 资源,它指向该池。
当我触发网络服务时,我看到我的应用正在运行。但是,当我尝试调用 VerfahrensArchivService(它应该将数据存储到数据库)时,会出现以下警告。在 web 服务测试器的 web 界面中,我进一步看到 InvocationTargetException,告诉我对“doPost”的调用失败。
WARNING: javax.ejb.EJBException: java.lang.IllegalStateException: Transaction is not active in the current thread.
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2016)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
at com.sun.proxy.$Proxy455.storeAndUpdateVerfahren(Unknown Source)
at de.kevinfleischer.zvagent.archiv.__EJB31_Generated__VerfahrensArchivService__Intf____Bean__.storeAndUpdateVerfahren(Unknown Source)
at de.kevinfleischer.zvagent.job.DailyReportingJob.executeJob(DailyReportingJob.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
之后数据库为空。未存储任何数据。
(我有 JUnit 测试,在没有应用服务器的情况下完全在本地工作,这表明代码可以存储数据。所以这是事务问题,而不是业务代码中的问题。)
【问题讨论】:
-
如果有人可以为我提供一个在 glassfish 4 上运行并使用 derbyDB 的示例 JEE5 maven 项目,那就太好了。就像一个代码 sn-p。或者,也许您可以指出一个设置教程。
标签: java web-services jpa glassfish jta