在JAXB中创建SOAP属性

时间:2011-04-22 09:08:07

标签: java web-services soap jaxb jax-ws

我目前正在学习JAXB和Web服务,我遇到了这个我不知道的问题 怎么解决。

假设我有一个非常简单的类,我用JAXB注释。

@XmlRootElement
public class Customer {
    private int custID;
    private String custName;
    //getters and setters
}

我有这个类,我作为Web服务公开。 (注意:为了简单起见,我在这里硬编码 但这连接到DB)

@WebService
public class CustomerWS {

    @WebMethod(operationName = "customerData")
    public Customer getCustomer(){
      Customer cust = new Customer();
      cust.setCustID(12345);
      cust.setCustName("John Doe");     
      return cust;
    }
}

SOAP信封响应是这样的。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:customerDataResponse xmlns:ns2="http://test.com/">
         <return>
            <custID>12345</custID>
            <custName>John Doe</custName>
         </return>
      </ns2:customerDataResponse>
   </S:Body>
</S:Envelope>

现在假设我在客户实体中有另一个名为status的属性,他们希望这个属性作为soap的属性 响应如下,而不是成为客户元素的一部分。 (A =有效,I =无效)

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:customerDataResponse status="A" xmlns:ns2="http://test.com/">
         <return>
            <custID>12345</custID>
            <custName>John Doe</custName>
         </return>
      </ns2:customerDataResponse>
   </S:Body>
</S:Envelope>

@XmlRootElement
public class Customer {
    private int custID;
    private String custName;

    //Another Annotation??? (A or I only)
    private String status;
    //getters and setters
}

如何注释我的课程以满足此要求?感谢

1 个答案:

答案 0 :(得分:4)

Customer类上注释的所有内容都与客户元素相关。

这是因为JAX-WS负责形成消息信封,然后JAXB将消息正文封送到此信封中。当JAXB组织整个身体的时候,改变信封为时已晚。