Веб-сервис с CXF: как использовать ResponseWrapper? - PullRequest
10 голосов
/ 20 ноября 2010

Мы создаем веб-сервис (на основе CXF), управляемый Java-классом (Java2WS), с помощью следующего метода:

  @WebMethod
  @RequestWrapper(className = "com.myproject.wrapper.MyRequestWrapper")
  @ResponseWrapper(className = "com.myproject.wrapper.MyResponseWrapper")
  public MyResponse verifyCode(@WebParam(name = "code") String code) {
    ...
    return new MyResponse("Hello",StatusEnum.okay);
  }

Я использую обертки для определения элементов запроса соотв. ответ более подробно: правильные имена элементов (начинающиеся с заглавной буквы), обязательные и необязательные элементы, ...). Но я не уверен, что это правильный способ сделать это (нет подробной документации об оболочках, не так ли?)

Класс MyResponse:

public class MyResponseWrapper {

  private String result;   
  private ModeEnum status;

  // getters and setters
}

Класс MyReponseWrapper

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "myResponse")
public class MyResponseWrapper {

  @XmlElement(name="Result")
  private String result;

  @XmlElement(name = "Status")
  private StatusEnum status;

  public MyResponseWrapper() {
    result="fu"; // just for testing
  }

  // getters and setters
}

В настоящее время я не понимаю обертки. Когда я возвращаю экземпляр MyReponse, каким образом данные из MyResponse внедряются в MyResponseWrapper соответственно в тело SOAP ответа?

Тестируя этот веб-сервис, я вижу, что создается экземпляр MyResponseWrapper, а тело SOAP содержит правильные элементы, но с данными по умолчанию (например: result = "fu" вместо "Hello"). Я ожидал, что CXF вставляет данные сопоставления из MyResponse в MyResponseWrapper. Это неправильно?

Если это неправильный способ сделать это: Wat - правильный способ указать результирующий XML SOAP при использовании Java2WS?

Кстати: приведенные выше фрагменты исходного кода - это просто примеры, взятые из наших более сложных (более полей) классов.

1 Ответ

1 голос
/ 12 сентября 2013

Это правильный способ сделать это. Оболочки запроса и ответа позволяют переопределять пространство имен xml и имена элементов / атрибутов для элементов запроса / ответа; соответственно - которые в свою очередь соответствуют методам, используемым для управления этими значениями.

Ссылка: http://cxf.apache.org/docs/developing-a-service.html#DevelopingaService-The@RequestWrapperannotation

Аннотация @RequestWrapper определяется Интерфейс javax.xml.ws.RequestWrapper. Он размещен на методах в SEI. Как следует из названия, @RequestWrapper определяет класс Java который реализует компонент-оболочку для параметров метода, которые включается в сообщение запроса, отправленное в удаленном вызове. это также используется для указания имен элементов и пространств имен, используемых время выполнения при маршалинге и демаршаллинге сообщений запроса.

В следующей таблице описаны свойства @RequestWrapper. аннотаций.

LocalName

Определяет локальное имя элемента-оболочки в XML представление сообщения запроса. Значением по умолчанию является имя метода или значения аннотации @WebMethod свойство operationName.

* 1015 целевое пространство *

Указывает пространство имен, в котором находится элемент оболочки XML определены. Значением по умолчанию является целевое пространство имен SEI.

1019 * имя класса *

Определяет полное имя класса Java, который реализует оболочку элемент. * +1021 *

...