Невозможно десериализовать ввод JSON - PullRequest
0 голосов
/ 16 ноября 2018

Я разрабатываю полноценные веб-сервисы с использованием 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.

Есть указатели?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...