gpt4 book ai didi

java - 使用 Apache CXF 的 Web 服务上的命名空间问题

转载 作者:搜寻专家 更新时间:2023-11-01 01:44:14 29 4
gpt4 key购买 nike

我正在使用 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、package-info.class和cxf-servlet.xml配置文件以及@WebService注解。任何人都可以指出我在这里缺少的正确方向吗?

最佳答案

问题的根源是wsgen,我认为这是一个bug。它不会使 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 类。如您所见,它为根设置了命名空间,但它不是合格的形式,它也不会生成包信息文件。

@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;

关于java - 使用 Apache CXF 的 Web 服务上的命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16524372/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com