我们使用javax.ws.rs.ext.ExceptionMapper<Exception>注释@javax.ws.rs.ext.Provider来处理所有异常.在内部,这ExceptionMapper可以区分不同类型的异常,以确定向客户端显示哪些信息.
在这种情况下javax.validation.ConstraintViolationException,我们返回有关哪个字段无效的其他信息以及原因.
我们刚刚切换TomEE 1.7.2 JAX-RS到TomEE 7.0.0-SNAPSHOT webprofile.
随着TomEE 1.7.2 JAX-RS我们使用的openejb.jaxrs.providers.auto=true系统属性,我们ExceptionMapper已自动发现和使用.
随着TomEE 7.0.0-SNAPSHOT webprofile物业不再需要从汽车发现中受益.
然而,org.apache.cxf.jaxrs.validation.ValidationExceptionMapper也发现,现在作为首选ExceptionMapper的javax.validation.ConstraintViolationException.我们自己ExceptionMapper没有运行,因此客户端无法获得有关验证过程中出错的信息.
我们自己ExceptionMapper<Exception>仍处理所有其他异常.
ExceptionMapper我把自己放在我的javax.ws.rs.ext.ExceptionMapper<javax.validation.ConstraintViolationException>资源旁边,希望它优先于CXF.
仍然org.apache.cxf.jaxrs.validation.ValidationExceptionMapper优先.
更新:事实证明这确实可以解决问题.我不知道为什么我的初步测试不起作用.
ValidationExceptionMapper通道system.properties在我注意到的更改日志中TomEE 7.0.0-SNAPSHOT
TOMEE-1336支持自动发现的提供程序的classname.activated = true/false
看看相应的变更集我希望我可以org.apache.cxf.jaxrs.validation.ValidationExceptionMapper通过向我们添加org.apache.cxf.jaxrs.validation.ValidationExceptionMapper.activated = false来禁用它system.properties. …
com.datastax.driver.core.Session该类的文档说明了这一点
(...)每个会话维护与群集节点的多个连接(...)
但是,对EE环境的一般建议是将池和线程管理留给容器.
在我看来,DataStax驱动程序(主要不是针对EE环境)违反了这一规则.这让我担心驱动程序是否可以在我的EE应用程序中安全使用.
我们希望将Hazelcast用作TomEE中的JCache实现.由于我们不需要疯狂的性能,目前我们希望将Hazelcast节点作为我们应用程序的一部分运行.
我们使用Hazelcast 3.7和TomEE 7.0.1.
当停止TomEE时,它WARNING - The web application [APPLICATION_NAME] appears to have started a thread named [SOMENAME] but has failed to stop it. This is very likely to create a memory leak.会多次抱怨并且VM不会正常停止但会继续运行.
解决方法显然是在它看起来空闲时立即终止进程.毋庸置疑,这正在推动我们的开发人员和开发人员疯狂.
为了排除在TomEE内部运行Hazelcast节点引起问题的可能性,我尝试启动一个独立的Hazelcast节点并将我们的应用程序更改为仅使用Hazelcast客户端连接到所述节点.行为保持不变.据我所知,在几次网络搜索中,Hazelcast客户端也会启动多个线程,与服务器节点进行通信.
这个问题不是重复的Hazelcast阻止JVM终止,因为我们完全依赖于Hazelcasts JCache实现.我们不Hazelcast直接访问实例,因此我们无法调用shutDownAll().
我想使用安排重复的后台任务ManagedScheduledExecutorService.我通过一个获得我的Runnables/Callables Instance,所以我的任务中有注入功能.
我的应用程序运行TomEE 7.0.0-SNAPSHOT webprofile.
当这些任务访问数据库时,他们需要一个事务.但是,Runnable/ Callableno事务内部是活动的.
ManagedScheduledExecutorService的文档说明了这一点
如果需要事务,请使用javax.transaction.UserTransaction实例.通过使用Resource注释请求注入UserTransaction对象,可以使用UserTransaction实例(...).
但是,注入了
@Resource
private UserTransaction userTransaction;
Run Code Online (Sandbox Code Playgroud)
是null在调用任务时.
我采用的另一种方法是将无状态EJB注入到我的任务中,希望这会为我创建一个事务.
这导致启动时出现以下异常:
SEVERE: CDI Beans module deployment failed
java.lang.IllegalStateException: no interface to proxy for ejb StatelessEjb, is this is a MDB maybe you shouldn't use a scope?
at org.apache.openejb.cdi.CdiEjbBean.createEjb(CdiEjbBean.java:252)
at org.apache.openejb.cdi.CdiPlugin.getSessionBeanProxy(CdiPlugin.java:224)
at org.apache.webbeans.container.BeanManagerImpl.getEjbOrJmsProxyReference(BeanManagerImpl.java:951)
at org.apache.webbeans.container.BeanManagerImpl.getReference(BeanManagerImpl.java:777)
at org.apache.webbeans.container.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:651)
at org.apache.webbeans.inject.AbstractInjectable.inject(AbstractInjectable.java:111)
at org.apache.webbeans.inject.InjectableConstructor.createParameters(InjectableConstructor.java:109)
at org.apache.webbeans.inject.InjectableConstructor.doInjection(InjectableConstructor.java:72)
at …Run Code Online (Sandbox Code Playgroud)