JAX-WS =安装Apache CXF后,它将“窃取”默认的JDK JAX-WS实现,如何解决? - java

我有一个奇怪的问题。

  • 我使用wsimport从WSDL(在专用的Eclipse Java项目中)生成了ALS JAX-WS代码。在没有任何外部依赖项(在Eclipse中运行)
  • 的情况下,它在JDK6中可以正常工作

  • 我有第二个项目,我曾经使用Apache CXF。如果我将1.)中描述的代码复制到该项目中,突然之间JDK将不会执行JAX-WS东西(我生成的文件),而是执行Apache CXF。
  • 如何防止Apache CXF“运行” JAX-WS东西。 (问题是,CXF无法运行代码...)。我也完全不了解Apache CXF是如何发现这些类的。我没有注册他们吗?

    非常感谢你!
    马库斯

    参考方案

    Apache CXF(准确地说是cxf-rt-frontend-jaxws-*.jar)将自己注册为JVM中的JAX-WS提供程序。在前面提到的JAR中,有一个名为/META-INF/services/javax.xml.ws.spi.Provider的文件,其内容如下:

    org.apache.cxf.jaxws.spi.ProviderImpl
    

    现在,如果您查看javax.xml.ws.spi.FactoryFinder#find方法,您会发现JDK在CLASSPATH中搜索是否存在javax.xml.ws.spi.Provider文件,如果没有,则回退到默认的Sun实现。因此,您有两种方法可以强制回退:

  • 可以从CLASSPATH
  • 中删除cxf-rt-frontend-jaxws-*.jar

  • 或覆盖CXF提供的javax.xml.ws.spi.Provider文件以指向后备位置
  • 第二个选项实际上要容易一些。只需创建:

    /src/main/resources/META-INF/services/javax.xml.ws.spi.Provider
    

    具有以下内容的文件(假设您正在使用Maven):

    org.apache.cxf.jaxws.spi.ProviderImpl
    

    就是这样,用javax.xml.ws.Endpoint#publish测试。

    将生成的类放入不同的Web服务的同一包中 - java

    我有几个JAX-WS Web服务,它们使用相同的类,但是从wsdl(在客户端)生成后,相同的类具有不同的包。我发现了如何使用@xmltype批注将它们放入同一包中。但是我不能使用它,因为源代码不可用。在服务部署期间是否可以通过某种方式修复它? 参考方案 您如何从WSDL生成客户端代码?如果您使用maven,则可以在插件设置中指定生成类的包(例如apache …

    JAX WS SOAP处理程序,用于过滤掉无效的xml字符 - java

    我有一个Web服务,在客户端中传递带有一些无效xml字符的字符串。并且在服务器端解析请求时,JAXWS抛出异常,因为它无法解析无效的xml字符。为了解决此问题,我尝试创建以下SOAPHandler。在下面的SOAPHandler中,我尝试迭代子元素,这意味着我已经在解析xml,因此在处理程序本身中获取了异常。如何从邮件中删除无效的xml字符?import j…

    代理服务器上的JAX-WS客户端认证 - java

    我正在尝试使用JAX-WS api在客户端应用程序上发送一些肥皂消息。但是,我位于防火墙后面,唯一的选择是使用代理服务器进行访问。我试图在Google上找到有关此问题的任何答案,但到目前为止都失败了:要对System.setProperty,http.proxyHost,http.proxyPort,http.proxyUser使用http.proxyPas…

    jax-ws绑定-方法未重命名,而类被重命名 - java

    我觉得自己被卡住了。这是wsdl:http://www.doffin.no/ws/tdeservice.asmx?wsdl我使用apache maven cxf插件生成类。由于名称的序列为“ X0020”,因此我想重命名两个类。为wsdl:definitions / wsdl:service [@ name ='TDE_x0020_Connect']生成的一…

    JAX RS,我的过滤器不起作用 - java

    我正在研究:Best practice for REST token-based authentication with JAX-RS and Jersey但是我的过滤器未触发,我的呼叫直接传递到了端点...我的安全界面: @Qualifier @Retention(RUNTIME) @Target({METHOD, FIELD, PARAMETER, TY…