我根据 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,它有时会被错误地序列化为title
andsinger
而不是title_element
and 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 ”。