Пусть CXF / JAXB генерирует JAXBElement <Boolean>вместо логического - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть файл WSDL, в котором одна из многих операций просто возвращает boolean вместо объекта с полями:

<xs:element name="isUserActive" type="xs:boolean" />

Для генерации классов Java я использую CXF: org.apache.cxf.tools.wsdlto.WSDLToJava. Сгенерированный Port содержит следующую сигнатуру метода:

@WebMethod(action = "isUserActive")
@WebResult(name = "isUserActiveResponse", targetNamespace = "http://company.com/1.0", partName = "parameters")
public boolean isUserActive(
    @WebParam(partName = "parameters", name = "isUserActiveRequest", targetNamespace = "http://company.com/1.0") com.company.IsUserActiveRequest parameters
) throws Exception;

Я также получаю ObjectFactory для логического значения:

@XmlElementDecl(namespace = "http://company.com/1.0", name = "isUserActiveResponse")
public JAXBElement<Boolean> createIsUserActiveResponse(Boolean value) {
    return new JAXBElement<Boolean>(_IsUserActiveResponse_QNAME, Boolean.class, null, value);
}

К сожалению, Spring Boot не понимает это сопоставление и выдает исключение, когда клиент вызывает эту конечную точку: No adapter for endpoint [public boolean ..., поэтому я вручную изменяю сгенерированный Port, чтобы он возвращал JAXBElement<Boolean> вместо boolean, и использую ObjectFactory для создания такого объекта в реализации:

@PayloadRoot(namespace = TARGET_NAMESPACE, localPart = "isUserActiveRequest")
@ResponsePayload()
public JAXBElement<Boolean> isUserActive(@RequestPayload IsUserActiveRequest request) {
    ObjectFactory factory = new ObjectFactory();
    boolean result = doSomething();
    return factory.createIsActiveResponse(result);
}

Очевидно, что всякий раз, когда я заново генерирую классы Java из WSDL, эти ручные изменения игнорируются, поэтому я хотел бы знать, как мне настроить WSDL2Java, чтобы генерировать сигнатуру метода по желанию.

Я уже пытался предоставить настройку файла привязки generateElementProperty="true", но это также изменило бы другие сгенерированные классы, заменив типы их полей на JAXBElement<T>. Меня просто интересует тот конкретный метод, который переопределяет примитив boolean в качестве возвращаемого типа.

...