0

我根据 Accept 标头将 POJO 序列化为 JSON 和 XML。

@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。

查看我想要序列化为 XML 和 JSON 的 POJO 类,问题是在 Tomcat 中重新部署 .war 后序列化为 JSON 时,@XmlElement 并不总是有效。一半时间将声明的名称放在@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,它有时会被错误地序列化为titleandsinger而不是title_elementand 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 中重新部署相同的 war 文件并在 localhost:8080/jsonprop/json/metallica/post 上发出发布请求时,我得到"title"或者"title_element"如果我请求接收 application/json 并且这是一个问题,因为我需要始终获取“title_element ”。

战争文件链接

4

0 回答 0