@XmlElement не всегда работает при создании JSON и XML с использованием Jersey - PullRequest
0 голосов
/ 06 сентября 2018

Я сериализую POJO в JSON и XML в зависимости от заголовка Accept.

@Path("/json/metallica")
public class JSONService{

    @POST
    @Path("/post")
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Response getTrackInJSON() {
        Track track = new Track();
        track.setTitle("Enter Sandman");
        track.setSinger("Metallica");
        return Response.status(201).entity(track).build();
    }

}

Я хочу изменить имя тега XML вместе с именем ключа JSON, для этого я использовал @XmlElement, так как он, похоже, работает как с XML, так и с JSON.

Глядя на класс POJO, который я хочу сериализовать в XML и JSON, проблема в том, что @XmlElement не всегда работает при сериализации в JSON после повторного развертывания .war в Tomcat. Половину времени он помещает имя, объявленное в @XmlElement (name = ""), а другую половину - имя поля.

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Track {

    private String title;

    private String singer;

    public String getTitle() {
        return title;
    }

    @XmlElement(name = "title_element")
    public void setTitle(String title) {
        this.title = title;
    }

    public String getSinger() {
        return singer;
    }

    @XmlElement(name = "singer_element")
    public void setSinger(String singer) {
        this.singer = singer;
    }

    @Override
    public String toString() {
        return "Track [title=" + title + ", singer=" + singer + "]";
    }

}

Результат для этого в XML всегда корректен как <singer_element> и <title_element>

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<track>
    <singer_element>Metallica</singer_element>
    <title_element>Enter Sandman</title_element>
</track>

, но для JSON иногда неправильно сериализуется как title и singer вместо title_element и singer_element.

 {
    "title": "Enter Sandman",
    "singer": "Metallica"
}

Повторное развертывание того же файла .war иногда приводит к требуемому форматированию.

{
    "title_element": "Enter Sandman",
    "singer_element": "Metallica"
}

pom.xml зависимости

<dependencies>
        <!-- JAX-RS -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1</version>
        </dependency>

        <!-- Jersey -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.27</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>2.27</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.27</version>
        </dependency>

        <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.6</version>
        </dependency>

    </dependencies>

Я использую apache-tomcat-9.0.11-windows-x64.

При повторном развертывании того же файла войны в Tomcat и отправке запроса на локальный хост: 8080 / jsonprop / json / metallica / post я получаю "title" или "title_element", если я запрашиваю application / json, и это проблема, потому что мне нужно всегда получать "title_element".

Ссылка на файл войны

...