JBoss模块很烂,无法在JBoss 7下使用自定义Resteasy / JAX-RS
由于JBoss EAP 6.1 / AS 7.2.0是模塊化的,并且您可以排除Webapp可見的模塊,因此您希望可以輕松地忽略內置的JAX-RS實現(xiàn)(Rest Easy 2.3.6)并使用它。自定義的(3.0.6)。 但是,可悲的是,事實并非如此。 您必須遵守官方指南的建議,即在全球范圍內升級Rest Easy –前提是服務器上運行的其他Web應用程序均不會因升級而中斷。
這應該足以排除內置的Rest Easy,并能夠使用webapp中包含的版本:
但是,它遠沒有奏效。 這幾乎可以完成工作(盡管其中的少數(shù)排除可能是不必要的):
<!--?jboss-deployment-structure.xml --> <?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure><deployment><exclude-subsystems><subsystem name="resteasy"/></exclude-subsystems><exclusions><module name="org.apache.log4j" /><module name="org.apache.commons.logging"/><module name="org.jboss.as.jaxrs"/><module name="org.jboss.resteasy.resteasy-jaxrs"/><module name="org.jboss.resteasy.resteasy-cdi"/><module name="org.jboss.resteasy.jackson-provider"/><module name="org.jboss.resteasy.resteasy-atom-provider"/><module name="org.jboss.resteasy.resteasy-hibernatevalidator-provider"/><module name="org.jboss.resteasy.resteasy-jaxb-provider"/><module name="org.jboss.resteasy.resteasy-jettison-provider"/><module name="org.jboss.resteasy.resteasy-jsapi"/><module name="org.jboss.resteasy.resteasy-multipart-provider"/><module name="org.jboss.resteasy.resteasy-yaml-provider"/><module name="org.codehaus.jackson.jackson-core-asl"/><module name="org.codehaus.jackson.jackson-jaxrs"/><module name="org.codehaus.jackson.jackson-mapper-asl"/><module name="org.codehaus.jackson.jackson-xc"/><module name="org.codehaus.jettison"/><module name="javax.ws.rs.api"/></exclusions></deployment></jboss-deployment-structure>但是,只有近。 問題是排除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失敗嘗試的大概歷史
我不再記得我經(jīng)歷過的所有死胡同,但是這里是我在部署或運行??時遇到的異常的大致概述。
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.<init>(Lorg/jboss/resteasy/spi/ResteasyProviderFactory;)V–通過將更多的RestEasy / Jackson模塊添加到排除列表中可能修復
java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/core/MultivaluedMap;–這是無法解決的最終問題; 問題是, BuiltResponse從resteasy-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應用程序,那么您將陷入困境。
經(jīng)驗教訓:具有大量現(xiàn)成的,集成良好的功能(?)的應用程序服務器似乎很有吸引力,但是當您遇到?jīng)_突的庫和類加載問題時,它們的價值就會Swift下降。 從長遠來看,從您完全控制的簡單事物(例如Jettty)開始,也許是一個更好的解決方案。 同樣,在同一臺服務器上運行多個Web應用程序在2000年也許很聰明,但如今已不值一提。 我們有足夠的磁盤空間和內存,因此庫的重用并不重要,并且能夠在一處管理所有應用程序的全局設置的能力當然是更好的選擇。 微服務FTW!
翻譯自: 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: typec充电接口长什么样(typec充
- 下一篇: 二类头孢有哪些