问题的根源是wsgen,我认为这是一个错误。它不会使 wsdl 和 jaxb 生成的类兼容。在 jaxb 生成的类中,元素不是默认形式限定的,这会将参数元素放入 null 命名空间。然而在 WSDL 中,它IS默认形式合格,这就是问题所在。可能有很多方法可以解决这个问题,我发现的最快速和最肮脏的方法是在 @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;