Как сделать имена полей прописными в JAXB в java объекте? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь преобразовать Java объект в XML, используя JAXB, и он работает для меня, но он преобразует имя полей класса в строчную букву, и я не знаю, как изменить заглавные буквы , Например, мой класс:

@XmlRootElement(name = "StockQuoteRequest")
@Component
public class StockQuoteRequest {

    @XmlElement(name = "Security")
    private Security securities;

// constructor   
// getter/setter
// toString
}

Вот класс Безопасность :

@Component
public class Security {

    private String name;
    private String lastName;
    private String address;

    // constructor   
    // getter/setter
    // toString
}

Для класса StockQuoteRequest , поле Безопасность заглавными буквами, но для класса Security его поля ( name, lastName, address ) печатаются с маленьким.

Я попытался добавить аннотацию в классе Security над каждым полем

@XmlElement(name = "Name")
@XmlElement(name = "LastName")
@XmlElement(name = "Address")

Но это не работает вообще. Может кто-нибудь сказать мне, как это сделать? Благодаря.

1 Ответ

2 голосов
/ 01 апреля 2020

Я получаю следующее исключение в Java 8 (jdk1.8.0_181) при попытке вашего кода, т.е. когда я добавил стандартные методы получения / установки:

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "securities"
    this problem is related to the following location:
        at public Security StockQuoteRequest.getSecurities()
        at StockQuoteRequest
    this problem is related to the following location:
        at private Security StockQuoteRequest.securities
        at StockQuoteRequest

Чтобы исправить, мне пришлось сделать одна из 3 вещей:

  • Переместить аннотацию @XmlElement(name = "Security") вниз к методу getSecurities()

  • Добавить @XmlTransient к getSecurities() методу

  • Добавить @XmlAccessorType(XmlAccessType.NONE) (или FIELD) к StockQuoteRequest классу

Когда я в любом случае я получу вывод, подобный этому:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<StockQuoteRequest>
    <Security>
        <address>North Pole</address>
        <lastName>Doe</lastName>
        <name>John</name>
    </Security>
</StockQuoteRequest>

Обратите внимание, что 3 подэлемента расположены в неправильном порядке. Чтобы исправить это, добавьте @XmlType(propOrder = { "name", "lastName", "address" }) к классу Security.

Когда я затем добавил аннотации 3 @XmlElement, показанные в вопросе, к классу Security и применил аналогичное исправление для предотвращения исключения Я получаю то, что ожидал:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<StockQuoteRequest>
    <Security>
        <Name>John</Name>
        <LastName>Doe</LastName>
        <Address>North Pole</Address>
    </Security>
</StockQuoteRequest>

Полный Минимальный, воспроизводимый пример , чтобы получить вышеуказанный результат:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

public class Test {
    public static void main(String[] args) throws Exception {
        StockQuoteRequest request = new StockQuoteRequest(
                new Security("John", "Doe", "North Pole"));

        JAXBContext jaxbContext = JAXBContext.newInstance(StockQuoteRequest.class);
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(request, System.out);
    }
}

@XmlRootElement(name = "StockQuoteRequest")
@XmlAccessorType(XmlAccessType.NONE)
class StockQuoteRequest {

    @XmlElement(name = "Security")
    private Security securities;

    public StockQuoteRequest() {
    }

    public StockQuoteRequest(Security securities) {
        this.securities = securities;
    }

    public Security getSecurities() {
        return this.securities;
    }

    public void setSecurities(Security securities) {
        this.securities = securities;
    }

    @Override
    public String toString() {
        return "StockQuoteRequest" + this.securities;
    }

}

@XmlType(propOrder = { "name", "lastName", "address" })
@XmlAccessorType(XmlAccessType.NONE)
class Security {

    @XmlElement(name = "Name")
    private String name;
    @XmlElement(name = "LastName")
    private String lastName;
    @XmlElement(name = "Address")
    private String address;

    public Security() {
    }

    public Security(String name, String lastName, String address) {
        this.name = name;
        this.lastName = lastName;
        this.address = address;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return this.address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Security[name=" + this.name + ", lastName=" + this.lastName + ", address=" + this.address + "]";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...