2

我有一个调用部署在 Jboss 5 上的 WEB SERVICE 的类。我的 Java 环境是 JDK1.6。这是一个代码部分:

System.setProperty("org.apache.xerces.xni.parser.XMLParserConfiguration","org.apache.xerces.parsers.XIncludeAwareParserConfiguration");
final Document doc = this.generateXMLDoc((List) listData);
final String strXMLData = "TestString";
final String endpointURL = PropertyHandler.getValue("printWebServiceEndPoint");
final TestWebService testWebService = new TestWebService(new URL(endpointURL), new QName( "http://test.webservice.xyz/", "TestWebService"));
final TestService tservice = testWebService.getTestServicePort();
final String msg = tservice.print(strXMLData);
if (msg.equals("Abc"))
{
   return false;
}
return true;

我的 JBOSS_HOME/lib/endorsed 目录中有以下 jar。

激活.jar、resolver.jar、serializer.jar、stax-api.jar、xalan.jar、xercesImpl.jar、jaxb-api.jar

此 Web 服务在 JBoss4.2.2GA 上运行良好,但在 JBoss 5 上中断并抛出下面给出的错误。

01:50:46,760 INFO  [STDOUT] ERROR 01:50:46,759 (TestServiceInputXMLParser) - com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl cannot be cas to com.sun.xml.bind.api.JAXBRIContext
java.lang.ClassCastException: com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.bind.api.JAXBRIContext
at org.jboss.ws.metadata.umdm.EndpointMetaData.eagerInitializeAccessors(EndpointMetaData.java:665)
at org.jboss.ws.metadata.umdm.EndpointMetaData.initializeInternal(EndpointMetaData.java:545)
at org.jboss.ws.metadata.umdm.EndpointMetaData.eagerInitialize(EndpointMetaData.java:533)
at org.jboss.ws.metadata.builder.jaxws.JAXWSClientMetaDataBuilder.rebuildEndpointMetaData(JAXWSClientMetaDataBuilder.java:312)
at org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl.getPortInternal(ServiceDelegateImpl.java:269)
at org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl.getPort(ServiceDelegateImpl.java:200)
at javax.xml.ws.Service.getPort(Service.java:99)
at edu.wustl.webservice.catissuecore.test.TestWebService.getTestServicePort(TestWebService.java:50)
at edu.wustl.catissuecore.testservicemodule.TestServiceInputXMLParser.callTestService(TestServiceInputXMLParser.java:81)
at edu.wustl.catissuecore.action.TestAction.executeXSS(TestAction.java:159)
at edu.wustl.common.action.XSSSupportedAction.checkForXSSViolation(XSSSupportedAction.java:170)
at edu.wustl.common.action.XSSSupportedAction.execute(XSSSupportedAction.java:76)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:638)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:444)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:382)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:310)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1069)
at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:455)
at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:320)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.owasp.stinger.StingerFilter.doStinger(StingerFilter.java:365)
at org.owasp.stinger.StingerFilter.doStingerFilter(StingerFilter.java:293)
at org.owasp.stinger.StingerFilter.doFilter(StingerFilter.java:122)

任何指针都会很有用。

4

2 回答 2

1

我之前也遇到过很多类似的 JBoss 问题。为极简容器(例如 Tomcat)构建 webapp 需要将大量 jar 文件打包到您的战争中。但是,JBoss 已经内置了大量的 jars。当多个 jars 中存在相同的类时,类加载器通常会首先找到您打包的类(通常是实现,例如 jaxb-impl 并加载您的 jaxb-api),然后加载内置类(通常是 api 类,例如内置 jaxb-api)并尝试将您的实现对象与内置 api 一起使用。这将失败,因为尽管它们可能完全相同,但它们被认为是来自不同来源的非常不同的类。我什至看到错误指出“不能将 X 类强制转换为 X 类”,这在您理解原因之前是非常违反直觉的。

因此,您应该始终避免将 JBoss 内置的 jar 打包到您的战争中。可能有更好的方法(在这种情况下我也很感兴趣;-)),但我们发现的唯一可靠的策略是:

  • 检查内置的 JBoss jar 文件并将它们与打包到你的战争中的 jar 匹配
  • 在匹配的情况下,将罐子从你的战争中排除
  • 如果匹配的 jar 有不同的版本,请更改您的实现以使用内置的 JBoss 版本

您可以使用例如单独的 JBoss maven 配置文件和带有 maven-war-plugin 的 packagingExclude 配置选项来排除不必要的战争文件。

于 2013-08-12T11:43:50.480 回答
0

不要将 jaxb/jaxws jar 放在 endorsed 目录中——它们应该已经包含在 JBoss 容器中。可能发生的情况是,您放在认可目录中的 jaxb-api jar 与 JBoss 中的 jaxb-impl jar 是不同版本的 jaxb。

于 2013-08-06T18:22:47.173 回答