Я сериализую 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".
Ссылка на файл войны