Я разрабатываю полноценные веб-сервисы с использованием JAX-RS и Apache CXF. Джексон находится в пути к классам, но я не уверен, использует ли Apache CXF то же самое для сериализации / десериализации классов. Я пытаюсь POST объект (DTO), который является внутренним статическим классом и выглядит так:
@XmlRootElement(name = "dto")
public static class DTO implements Comparable<DTO>, Cloneable{
private long id;
private String name;
private Collection<Class1> obj1;
private Collection<Class2> obj2;
@JsonDeserialize(as=SomeConcreteClass.class)
private Collection<String, Class3> obj3;
//getters and setters
}
Class1, Class2 и Class3 также являются внутренними статическими классами внутри того же внешнего класса, в котором находится класс DTO. Там классы, в том числе и мой класс DTO, НЕ снабжены аннотациями JSON, а только аннотациями XML, такими как @XmlRootElement и @XMLType. Должен ли я аннотировать свой класс DTO и Class1, Class2 и Class3 аннотацией JSON, например @JsonTypeName?
Существует еще один внутренний класс (внутри того же внешнего класса), который содержит коллекцию для вышеуказанного DTO и выглядит следующим образом:
@XmlRootElement(name = "dtos")
@XmlType(name = "DTOsType")
public static class DTOs{
@JsonProperty("dtos")
private Collection<DTO> values;
public DTOs() {
}
public DTOs(final Collection<DTO> values) {
this.values = values;
}
@JsonProperty("dtos")
@XmlElement(name = "dto")
public Collection<DTO> getValues() {
return values;
}
@JsonProperty("dtos")
public void setValues(final Collection<DTO> values) {
this.values = values;
}
}
obj1 и obj2 - это TreeSet, а obj3 - это TreeMap.
На стороне сервера моя конечная точка выглядит так
@POST
@Path("{name}/endpoint")
@Consumes({ MediaType.APPLICATION_XML, MediaType.TEXT_XML,
MediaType.APPLICATION_JSON })
@Produces({ MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML,
MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
public Response addDTO(@PathParam("name") String name, DTOs dtos) {
//code here
...........
...........
}
Ввод JSON выглядит следующим образом
{
"dtos":
{
"dto":
{
"class1s":
{
"class1": [
{
.......
},
{
........
}
]},
"name": "somename",
"class3s":
{
"class3":
{
.........
}
},
"id": 555589024908,
}
}
Теперь, когда я отправляю JSON в теле запроса через почтальона, я получаю следующую ошибку
Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT
token
at [Source: (org.apache.cxf.transport.http.AbstractHTTPDestination$1); line:
3, column: 1] (through reference chain: my DTO class ["dto"])
Я уже прошел через это:
Невозможно десериализовать экземпляр java.util.ArrayList из токена START_OBJECT
Я не уверен, как написать оболочку или отправить JSON в виде строки в мой бэкэнд-метод REST. Проблема в части десериализации, которая обрабатывается платформой.
Этот сервис хорошо работает с вводом XML.
Есть указатели?
Спасибо!