JBoss模块很糟糕,无法在JBoss 7下使用自定义Resteasy / JAX-RS

由于JBoss EAP 6.1 / AS 7.2.0是模块化的,并且您可以排除Web应用程序可见的模块,因此您希望可以轻松地忽略内置的JAX-RS实现(Rest Easy 2.3.6)并使用它。自定义的(3.0.6)。 但是,可悲的是,事实并非如此。 您必须遵守官方指南的建议,即在全球范围内升级Rest Easy –前提是服务器上运行的其他Web应用程序均不会因升级而中断。

这应该足以排除内置的Rest Easy,并能够使用webapp中包含的版本:




   
       
           
       
   
 

但是,它远没有奏效。 几乎可以完成工作(尽管其中的少数排除可能是不必要的):




   
       
           
       
     
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
     
   
 

但是,只有近。 问题是排除javax.ws.rs.api无效。 似乎不能排除核心Java EE API。 死路。

顺便说一句,这是我最后与jax-rs相关的依赖项:

// resteasyVersion = '3.0.6.Final'
compile group: 'org.jboss.resteasy', name: 'jaxrs-api', version: resteasyVersion
compile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: resteasyVersion
compile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: resteasyVersion // JSONP
compile group: 'org.jboss.resteasy', name: 'async-http-servlet-3.0', version: resteasyVersion // Required at runtime
compile group: 'org.jboss.resteasy', name: 'resteasy-servlet-initializer', version: resteasyVersion // Required at runtime

失败尝试的大概历史

我不再记得我经历过的所有死胡同,但是这里是我在部署或运行​​时遇到的异常的大致概述。

java.lang.ClassNotFoundException: org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher

–通过将org.jboss.resteasy:async-http-servlet-3.0:3.0.6.Final到依赖项进行org.jboss.resteasy:async-http-servlet-3.0:3.0.6.Final

java.lang.ClassCastException: myapp.rs.RestApplication cannot be cast to javax.servlet.Servlet

–通过将org.jboss.resteasy:resteasy-servlet-initializer:3.0.6.Final到依赖项进行org.jboss.resteasy:resteasy-servlet-initializer:3.0.6.Final

java.lang.NoSuchMethodError: org.jboss.resteasy.spi.ResteasyProviderFactory.(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V

–通过将更多的RestEasy / Jackson模块添加到排除列表中可能修复

java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/core/MultivaluedMap;

–这是无法解决的最终问题; 问题是, BuiltResponseresteasy-jaxrs从继承javax.ws.rs.core.Response不过的版本从这个类JAXRS-API 3.0.6.Final.jar是有利于忽略Response从JAX-RS 1.1 javax.ws.rs.api模块( /jboss-eap-6.1.0/modules/system/layers/base/javax/ws/rs/api/main/jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar ),它缺少getHeaders方法,并且如上所述,不能将其排除。 (感谢allprog暗示了这一冲突 !)

结论

使用较新的JAX-RS的唯一方法是升级JBoss模块。 如果那会破坏其他Web应用程序,那么您将陷入困境。

经验教训:具有大量现成的,集成良好的功能(?)的应用程序服务器似乎很有吸引力,但是当您遇到冲突的库和类加载问题时,它们的价值会Swift下降。 从长远来看,从您完全控制的简单事物(例如Jettty)开始,也许是一个更好的解决方案。 另外,在同一台服务器上运行多个Web应用程序在2000年也许很聪明,但如今已不值得一试。 我们拥有足够的磁盘空间和内存,因此库的重用并不重要,并且能够在一处管理所有应用程序的全局设置的能力当然是更好的选择。 微服务FTW!

参考: JBoss模块很烂 ,在The Holy Java博客上,无法使用JCG合作伙伴 Jakub Holy的JBoss 7下的Custom Resteasy / JAX-RS 。

翻译自: https://www.javacodegeeks.com/2014/02/jboss-modules-suck-its-impossible-to-use-custom-resteasyjax-rs-under-jboss-7.html

你可能感兴趣的:(JBoss模块很糟糕,无法在JBoss 7下使用自定义Resteasy / JAX-RS)