当前位置: 首页 > 知识库问答 >
问题:

在Java 1.6中为JAX-WS提供不同版本的JAXB

田宇
2023-03-14

我有一个带有jaxb-impl.jar的第三方jar,并将其包含在清单类路径中。问题是,提供自己的JAXB版本(不管它是哪个版本)似乎会破坏JAX-WS中的SoapFaultBuilder。

根据非官方的JAXB指南,Sun在将JAXB折叠到JDK中时似乎故意更改了包名,以避免与独立版本发生冲突。但是,JDK附带的SoapFaultBuilder(我相信是JAX-WS的一部分)明确依赖于新的内部包名。如果您添加了一个独立的JAXB jar(即使它是相同的JAXB版本号),那么这会导致它在构建错误消息时失败。

package wstest;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld{

    @WebMethod String getHelloWorldAsString(String name);

}
package wstest;

import javax.jws.WebService;

//Service Implementation
@WebService(endpointInterface = "wstest.HelloWorld")
public class HelloWorldImpl implements HelloWorld{

    @Override
    public String getHelloWorldAsString(String name) {
        //return "Hello World JAX-WS " + name;
        throw new RuntimeException("Exception for: " + name);
    }

}
package wstest;

import javax.xml.ws.Endpoint;

//Endpoint publisher
public class HelloWorldPublisher{

    public static void main(String[] args) {
       Endpoint.publish("http://localhost:9999/ws/hello", new HelloWorldImpl());
    }

}
package wstest;

import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class HelloWorldClient{

    public static void main(String[] args) throws Exception {

    URL url = new URL("http://localhost:9999/ws/hello?wsdl");

        //1st argument service URI, refer to wsdl document above
    //2nd argument is service name, refer to wsdl document above
        QName qname = new QName("http://wstest/", "HelloWorldImplService");

        Service service = Service.create(url, qname);

        HelloWorld hello = service.getPort(HelloWorld.class);

        System.out.println(hello.getHelloWorldAsString("Matt"));

    }

}
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
    at $Proxy19.getHelloWorldAsString(Unknown Source)
    at wstest.HelloWorldClient.main(HelloWorldClient.java:21)
Caused by: java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext
    at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:533)
    ... 5 more

发生此异常的原因是,我的jaxb-impl中的com.sun.xml.bind.v2.runtime.jaxbContexTimpl扩展了com.sun.xml.bind.api.jaxbricontext而不是com.sun.xml.internal.bind.api.jaxbricontext(注意包层次结构中缺少“internal”子包)。

另外,根据非官方的JAXB指南,他们说,为了正确地覆盖JAXB的版本,您需要使用已认可的lib。结果是,SOAPFaultBuilder使用JAXBContext.newInstance()在类路径中搜索名为/meta-inf/services/javax.xml.bind.JAXBContext的文件,然后根据文件中指定的类名手动加载(并自反地创建)一个JAXBContext。所以这并不重要-类路径或背书的lib给你同样的行为。

一种解决方法是将-djavax.xml.bind.jaxbcontext=com.sun.xml.internal.bind.v2.contextFactory添加到命令行,这会导致jaxbcontext.newInstance()忽略类路径上的/meta-inf/services/javax.xml.bind.jaxbcontext文件,并手动指定JAXB的内置版本。另一种解决方法是不指定您自己的JAXB而使用JDK内置的版本,但从非官方的JAXB指南看来,Sun设计这个系统是为了能够处理提供您自己的JAXB实现。是否有人能够成功地提供JAXB的一个版本,并且仍然能够成功地捕获故障消息?(只要Web服务没有产生故障,对我来说一切都运行得很好)。

共有1个答案

夔光霁
2023-03-14

我被困在这个问题上,但是能够使用下面列出的“解决问题” <罢工> 论坛 通过设置系统属性进行问答,如下所示:

System.setProperty("javax.xml.bind.JAXBContext", 
                   "com.sun.xml.internal.bind.v2.ContextFactory"); 
 类似资料:
  • 问题内容: 作为测试项目,我使用wsdl和jax- ws创建了一个非常简单的WebService。如果客户端作为GlassFish中的Web应用程序部署,则客户端运行得很好,但是如果我直接在Eclipse中启动相同的(WebService-)代码,则会收到以下错误: 经过研究,我发现它与某些版本的库文件有一定关系。所以现在我的问题是,如何才能“修复” Eclipse Java执行以正确运行我的We

  • 我使用JAX-WS制作了一个小型Web服务。WSDL文件有这样的TYPES元素。 Web服务的URL是,XSD是。位于不同位置的XSD模式文件具有这样的数据类型定义。 我看到的大多数WSDL文件通常在WSDL文件本身中有完整的XSD定义,但JAX-WS将其放置在不同的位置。 应该是这样吗?如何配置JAX-WS将所有XSD定义放在一个WSDL文件中?

  • 我需要访问JDK 11中的遗留SOAP网络服务。但是我正在遭受“找不到提供商” JDK11实现是:zulu11。2.3-jdk11。0.1-win_x64。 在我的build.gradle,我有以下依赖: 我看到: 以下https://github.com/javaee/metro-jax-ws/issues/1247我尝试设置: -贾瓦克斯。xml。ws。spi。Provider=com。太阳x

  • 我部署了一个简单的JAX-WS服务,首先构建契约。在JAX-WSendpoint配置中,我指定了原始wsdl的位置。但是,这不是cxf返回的wsdl。原始wsdl包含策略语句,这些语句是契约的重要组成部分,应该在wsdl中对服务使用者可见。 我知道我在endpoint上设置的wsdl位置是正确的。如果不正确,战争部署就会失败。我还记录了要再次检查的值。 在本地部署时,该服务在以下位置可用:http

  • 我是web服务的新手,我试图在Eclipse中使用jax-rs rest和spring来做一个项目。我使用Java1.8,但eclipse向我显示了一个JAX-RS2.0需要Java1.6或更新的错误,我的项目将无法工作 这是项目资源管理器和错误的截图。我试着用谷歌搜索,但找不到任何英文解决方案

  • JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要