Почему CXF не будет аннотировать пустой параметр с помощью @XmlJavaAdapter?

О проблеме

Я использую Wsdl2Java для генерации классов Java из файла wsdl. Jaxb выдает исключение "неизвестный демаршаллер" при использовании сгенерированного интерфейса веб-сервиса. Проблема существует в операциях, где их входным параметром является элемент типа xs: dateTime, такой как эта схема:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="asd:asd"
  elementFormDefault="qualified">
  <xsd:element name="DateSinceStart" type="xsd:dateTime"/>
</xsd:schema>

и JAXB имеет привязку:

<globalBindings>
    <javaType
            name="java.time.LocalDateTime"
            xmlType="xs:dateTime"
            parseMethod="LocalDateTimeAdapter.unmarshal"
            printMethod="LocalDateTimeAdapter.marshal"/>
</globalBindings>

Jaxws привязка:

<bindings xmlns="http://java.sun.com/xml/ns/jaxws">
    <!-- Disable default wrapper style -->
    <enableWrapperStyle>false</enableWrapperStyle>
</bindings>

Затем сгенерированный MyServiceInterface.java принимает LocalDateTime в качестве входного аргумента. JaxB генерирует исключение из метода unmarshall, так как unmarshaller неизвестен контексту.

Что я ожидаю от генератора

В файле MyServiceInterface.java генератор должен добавить @XmlJavaTypeAdapter(Adapter1.class) строка над входным параметром LocalDateTime. Ручная вставка работает и позволяет JAXB понять, как разобрать этот тип:

@WebService(targetNamespace = "asd:asd", name = "MyServiceInterface")
@XmlSeeAlso({asd.asd.ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface MyServiceInterface {

    @WebMethod(operationName = "Operation", action = "asd:asd:#Operation")
    @WebResult(name = "OperationResponse", targetNamespace = "asd:asd", partName = "OperationResponseBody")
    public asd.asd.OperationResponseType operation(
        @WebParam(partName = "OperationBody", name = "DateSinceStart", targetNamespace = "asd:asd")
        @XmlJavaTypeAdapter(Adapter1.class)
        java.time.LocalDateTime operationBody
    );
}

Вопрос

Почему генератор не может вставлять аннотации автоматически? Это ошибка в структуре?

Примечание: если параметр обернут классом запроса, @XmlJavaAdapter правильно размещен над соответствующим полем.

контекст

Ниже я вставляю файлы контрактов только для того, чтобы понять мою проблему:

MyService.wsdl:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:tt="asd:asd"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  name="MyService"
  targetNamespace="asd:asd">
  <wsdl:documentation>
    <ServiceName>MyService</ServiceName>
    <Version>1</Version>
  </wsdl:documentation>
  <wsdl:types>
    <xsd:schema elementFormDefault="qualified" targetNamespace="asd:asd">
      <xsd:include schemaLocation="Operation.xsd"/>
      <xsd:include schemaLocation="OperationResponse.xsd"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="OperationMessage">
    <wsdl:part element="tt:DateSinceStart" name="OperationBody"/>
  </wsdl:message>
  <wsdl:message name="OperationResponseMessage">
    <wsdl:part element="tt:Response" name="OperationResponseBody"/>
  </wsdl:message>
  <wsdl:portType name="MyServiceInterface">
    <wsdl:operation name="Operation">
      <wsdl:input message="tt:OperationMessage" name="OperationIn">
      </wsdl:input>
      <wsdl:output message="tt:OperationResponseMessage" name="OperationOut">
      </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="MyServiceBinding" type="tt:MyServiceInterface">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Operation">
      <soap:operation soapAction="asd:asd:#Operation"/>
      <wsdl:input name="OperationIn">
        <soap:body parts="OperationBody" use="literal"/>
      </wsdl:input>
      <wsdl:output name="OperationOut">
        <soap:body parts="OperationResponseBody" use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding> 
  <wsdl:service name="MyService">
    <wsdl:port binding="tt:MyServiceBinding" name="MyService">
      <soap:address location="http://address"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Operation.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="asd:asd"
  elementFormDefault="qualified">
  <xsd:element name="DateSinceStart" type="xsd:dateTime"/>
</xsd:schema>

Я не вставляю содержимое OperationResponse.xsd, потому что оно содержит элемент xs:complexType, и все dateTimes имеют @XmlJavaAdapter аннотация в соответствующем поле LocalDateTime. Сложные типы просто в порядке.

0 ответов

Другие вопросы по тегам