首页 > 解决方案 > 让 CXF/JAXB 生成 JAXBElement而不是布尔值

问题描述

我有一个 WSDL 文件,其中许多操作之一只是返回 aboolean而不是带有字段的对象:

<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为返回 aJAXBElement<Boolean>而不是 aboolean并使用在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);
}

显然,每当我从 WSDL 重新生成 Java 类时,这些手动更改都会被丢弃,所以我想知道我应该如何配置WSDL2Java才能根据需要生成方法签名。

我已经尝试提供绑定文件设置generateElementProperty="true",但这也会通过将它们的字段类型替换为JAXBElement<T>. 我只是对覆盖原语boolean作为返回类型的特定方法感兴趣。

标签: jaxbcxfspring-wswsdl2java

解决方案


推荐阅读