JAXB java объект для xml, создание Pascal Case XML элементов - PullRequest
1 голос
/ 04 февраля 2020

Генерируемый объект из плагина wsdl через jaxb

@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);
    }
}

метод createRequest из ObjectFactory класс, сгенерированный JAXB:

   /**
     * 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>

Ожидаемый результат: все элементы внутри должны быть pascal case ( W ebAuthenticationDetail, K ey, 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>

1 Ответ

0 голосов
/ 04 февраля 2020

По умолчанию XmlMapper не распознает аннотации JAXB. Для их включения необходимо зарегистрировать модуль JaxbAnnotationModule .

Пример:

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