在与Apache CXF Web服务的命名空间的问题(namespace issue on web

2019-09-02 21:43发布

我使用Apache CXF 2.7.3,并运行到一个命名空间的问题,我真的不明白。 我已经广泛地尝试在此搜索,但大部分是我找到的结果是不同的行为。 问题是调用Web服务时,它会在参数元素的名称空间限定失败。 消息中的元件的所有其余的是限定的,而且它接受的是,只是没有参数元素。 这里是精确的行为:

请求WITHOUT参数元素合格:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:ord="http://www.example.org/order">
<soapenv:Header/>
   <soapenv:Body>
      <ord:getOrder>
         <id>a</id>
      </ord:getOrder>
   </soapenv:Body>
</soapenv:Envelope>

结果是成功的:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getOrderResponse xmlns:ns2="http://www.example.org/order">
         <return>
            <ns2:errorCode/>
            <ns2:errorMessage/>
            <ns2:order>
               <ns2:orderNumber>ABC123</ns2:orderNumber>
               <ns2:lastName>Smith</ns2:lastName>
            </ns2:order>
         </return>
      </ns2:getOrderResponse>
   </soap:Body>
</soap:Envelope>

WITH参数合格要求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:ord="http://www.example.org/order">
   <soapenv:Header/>
   <soapenv:Body>
      <ord:getOrder>
         <ord:id>a</ord:id>
      </ord:getOrder>
   </soapenv:Body>
</soapenv:Envelope>

导致从JAXB异常:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unmarshalling Error: unexpected element (uri:"http://www.example.org/order", local:"id"). Expected elements are &lt;{}id></faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

在所有我做过的研究,这通常意味着一个命名空间不匹配的地方。 但我已经彻底检查它,命名空间是相同的无处不在,包括ObjectFactory.class,包info.class和CXF-servlet.xml中的配置文件以及@WebService注释。 任何人都可以点我在正确的方向,以什么我在这里失踪?

Answer 1:

问题的根源是WSGEN,我认为这是一个错误。 它不会使WSDL和JAXB生成的类兼容。 在JAXB生成的类,这些元件不是默认形式合格,这使参数元素到一个空的命名空间。 然而,在WSDL 合格默认的形式,并存在着问题。 也许有许多方法来解决这个问题,最快速和肮脏的方法,我发现是设置在@WebParam批注的targetNamespace。 以下是代码片段展示了我的意思,我希望这可以帮助别人谁运行到这一点。

以下是我原本的自下而上的实现类:

@WebService(serviceName="OrderService")
public class OrderService {

    public OrderResponse getOrder(@WebParam(name="id", targetNamespace="http://www.example.org/order") String id)  {

这将导致以下生成的JAXB类。 正如你可以看到这台命名为root,但它没有形成合格的,它并不会生成包信息文件。

@XmlRootElement(name = "getOrder", namespace = "http://www.example.org/order")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getOrder", namespace = "http://www.example.org/order")

public class GetOrder {

    @XmlElement(name = "id")
    private java.lang.String id;

然后,我改变了服务实现类,命名空间添加到@WebParam:

@WebService(serviceName="OrderService", targetNamespace="http://www.example.org/order")
public class OrderService {

    public OrderResponse getOrder(@WebParam(name="id", targetNamespace="http://www.example.org/order") String id)  {

虽然这并不能使它默认窗体合格的,它的命名空间添加到生成的JAXB类的元素:

@XmlRootElement(name = "getOrder", namespace = "http://www.example.org/order")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getOrder", namespace = "http://www.example.org/order")

public class GetOrder {

    @XmlElement(name = "id", namespace = "http://www.example.org/order")
    private java.lang.String id;


文章来源: namespace issue on web service with Apache CXF