【问题标题】:JAXB java object to xml, create Pascal Case XML elementsJAXB java object to xml,创建 Pascal Case XML 元素
【发布时间】:2020-02-03 21:08:03
【问题描述】:

通过 jaxb 插件从 wsdl 生成的对象

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "WebAuthenticationCredential", propOrder = {
    "key",
    "password"
})
public class WebAuthenticationCredential {

    @XmlElement(name = "Key", required = true)
    protected String key;
    @XmlElement(name = "Password", required = true)
    protected String password;

方法:

public RateReply getRates(
        Request sRequest) {

    try {
        ObjectFactory objectFactory = new ObjectFactory();
        JAXBElement<WebAuthenticationCredential> soapRateRequest =
                objectFactory.createRateRequest(sRequest);
        XmlMapper xmlMapper = new XmlMapper();
        String xmlContent = xmlMapper.writeValueAsString(soapRateRequest);
        logger.info(xmlContent); // check below the response

        Reply rReply = (Reply) JAXBIntrospector
                .getValue(WebServiceTemplate.marshalSendAndReceive(serviceUri, soapRateRequest));
        handleErrors(rateReply);
        return rateReply;
    } catch (SoapFaultClientException e) {
        logger.error("Caught exception rates", e);
        throw new Exception("Failed calling service ", null);
    }
}

来自 JAXB 生成的 ObjectFactory 类的 createRequest 方法:

   /**
     * Create an instance of {@link JAXBElement }{@code <}{@link RateRequest }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "http://fedex.com/ws/rate/v14", name = "PreAuthorizedRateRequest")
    public JAXBElement<RateRequest> createPreAuthorizedRateRequest(RateRequest value) {
        return new JAXBElement<RateRequest>(_PreAuthorizedRateRequest_QNAME, RateRequest.class, null, value);

xmlContent 的记录器信息(使用驼峰式元素打印)是

<JAXBElement>
    <name>PreRequest</name>
    <declaredType>Request</declaredType>
    <scope>javax.xml.bind.JAXBElement$GlobalScope</scope>
    <value>
        <webAuthenticationDetail>
            <key>test</key>
            <password>password</password>
        </webAuthenticationDetail>
    </value>
</JAXBElement>

预期输出:里面的所有元素都应该是帕斯卡大小写(WebAuthenticationDetail, Key, P assword),用 JAXB 可以吗??

<JAXBElement>
    <name>PreRequest</name>
    <declaredType>Request</declaredType>
    <scope>javax.xml.bind.JAXBElement$GlobalScope</scope>
    <value>
        <WebAuthenticationDetail>
            <Key>test</Key>
            <Password>password</Password>
        </WebAuthenticationDetail>
    </value>
</JAXBElement>

【问题讨论】:

    标签: java spring maven jaxb maven-jaxb2-plugin


    【解决方案1】:

    默认情况下,XmlMapper 不识别 JAXB 注释。要启用它们,您需要注册模块 JaxbAnnotationModule

    例子:

    XmlMapper xmlMapper = new XmlMapper(); 
    xmlMapper.registerModule(new JaxbAnnotationModule());
    

    【讨论】:

    • 我添加了 XmlMapper 只是为了将 soapRequest 转换为字符串并在日志中打印出来,实际方法中没有使用 XmlMapper。你指的是别的什么吗??
    • 所以问题是在帕斯卡案例中没有通过这个请求发送值:“WebServiceTemplate.marshalSendAndReceive(serviceUri, soapRateRequest)”?那能不能把“public RateReply getRates”方法的全类贴出来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2020-01-18
    • 2013-11-16
    相关资源
    最近更新 更多