Создать атрибут SOAP в JAXB - PullRequest
3 голосов
/ 22 апреля 2011

В настоящее время я изучаю JAXB и Web-сервис, и у меня есть проблема, которую я не знаю, как решить.

Предположим, у меня есть очень простой класс, который я аннотировал с помощью JAXB.

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

И у меня есть этот класс, который я представляю как веб-сервис.(Примечание: я здесь все жестко кодирую для простоты, но это связано с БД)

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

Теперь предположим, что у меня есть другое свойство в клиентеобъект вызвал статус, и они хотели, чтобы это свойство в качестве атрибута мыльного ответа было таким, как показано ниже, а не являлось частью элемента customer.(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 Ответ

4 голосов
/ 22 апреля 2011

Все, что указано в классе Customer, будет относиться к элементу customer.

Это связано с тем, что JAX-WS отвечает за формирование конверта сообщения, а затем JAXB направляет тело сообщения в этот конверт. Когда JAXB придет время выстроить тело, уже слишком поздно менять конверт.

...