【问题标题】:Java webservice not working with Jdk 6 and Jboss 5.xJava webservice 不适用于 Jdk 6 和 Jboss 5.x
【发布时间】:2013-08-04 06:54:42
【问题描述】:

我有一个调用部署在 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。

activation.jar、resolver.jar、serializer.jar、stax-api.jar、xalan.jar、xercesImpl.jar、jaxb-api.jar

此网络服务在 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)

任何指针都会很有用。

【问题讨论】:

    标签: web-services jaxb java jboss5.x


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,JBoss 类加载器确实如此。但是我的 war 包中没有任何 Jaxbimpl.jar,因为我的应用程序是基于 Jdk 1.6 构建的,默认情况下其中包含 jaxb jar。我正在部署我的应用程序 Jboss 5.x,它具有不同版本的 jaxb impl jar。如果我试图删除它,Jboss 不会启动。相同的应用程序适用于带有 jdk 6 的 Jboss 7.x 和带有 Jdk 5.0 的 Jboss 4.2.2
    【解决方案2】:

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

    【讨论】:

    • 正如我上面已经提到的,背书目录包含以下 jarsactivation.jar、resolver.jar、serializer.jar、stax-api.jar、xalan.jar、xercesImpl.jar、jaxb-api。 jar 我还尝试下载 JAXB 2.1 库,并在他们的 jboss lib 目录和 jaxb-api.jar 中替换了认可的库。这也没有解决我的问题。
    • 我还尝试将 jboss-classloading.xml 放在我的 war/WEB-INF 目录中。对于我在谷歌上搜索的内容,JBoss 5.x 似乎不支持 jdk 6 的 web 服务,我尝试了谷歌搜索后得到的所有排列和组合。但它们都不起作用
    • 感谢所有这些,但要设置 System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");我也尝试了指定命令行参数 Djavax.xml.bind.JAXBContext=com.sun.xml.internal.bind.v2.ContextFactory 这两个解决方案都没有成功。我的网络服务请求直到实际的网络服务代码才到达。我在前几行得到了类转换异常。
    • 我认为 seb service deployer 下的 jbossws-native-core jar 引起了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多