Spring Boot: InvalidTypeIdException при попытке анализа Json - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь сопоставить POJO с JSON полученным ответом; однако, я продолжаю получать эту ошибку:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'order' as a subtype of `com.issbou.entity.OrdersList`: known type ids = [orders]

Ответ Json, который я получаю от сервера и который я пытаюсь сопоставить с моими классами POJO:

{
  "orders": [
    {
      "id": 2039665099999,
      "email": "isx@gmail.com"
    },
    {
      "id": 2039665066666,
      "email": "yzy@gmail.com"
    }
            ]
}

Order : Java Класс сущности, представляющий один ордер:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Order {

    @JsonProperty("id")
    private long id;

    @JsonProperty("email")
    private String email;

}

OrderList : Java Класс сущности, который создает список одиночных ордеров:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.Getter;
import lombok.Setter;


@JsonTypeName("orders")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT ,use = JsonTypeInfo.Id.NAME)
@Setter
@Getter
public class OrdersList {

    private List<Order> singleOrder;


}

Класс обслуживания:

@Service
public class BasicAuth {

   public ResponseEntity<OrdersList> orderDetails (@RequestBody OrdersList order){

       String username = "username";
       String password = "password";
       HttpHeaders headers = new HttpHeaders();
       headers.setBasicAuth(username, password);

       // request url
       String url = "https://test.myshopify.com/admin/orders.json";

       RestTemplate restTemplate = new RestTemplate();


       HttpEntity request = new HttpEntity(headers);

       ResponseEntity<OrdersList> response = restTemplate.exchange(
               url, HttpMethod.GET, request, OrdersList.class);

       return response;
   }

}

Контроллер покоя:

@RestController
public class Controller {

    @Autowired
    BasicAuth basicAuth;

    @GetMapping("/lok")
    @ResponseStatus(HttpStatus.FOUND)
    public ResponseEntity<OrdersList> getBasicAut(OrdersList ordersList){

        return basicAuth.orderDetails(ordersList);
    }

}

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Мне пришлось внести следующие изменения, чтобы успешно использовать введенные вами данные:

  1. Измените OrderList, чтобы добавить новое поле с именем orders.

    publi c class OrdersList {личный список singleOrder; личный список заказов; }

  2. Добавьте @PostMapping( "/lok" ) к вашему методу контроллера, чтобы иметь возможность POST вводить

  3. Добавить @RequestBody к входному параметру метода контроллера

Итак, измененный контроллер выглядит так:

@RestController
public class Controller {

    @Autowired
    BasicAuth basicAuth;

    @PostMapping( "/lok" )
    @GetMapping("/lok")
    @ResponseStatus(HttpStatus.FOUND)
    public ResponseEntity<OrdersList> getBasicAut( @RequestBody OrdersList ordersList){

        return basicAuth.orderDetails(ordersList);
    }
}
Пришлось закомментировать следующее из OrderList класса.

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

@JsonTypeName("orders")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT ,use = JsonTypeInfo.Id.NAME)
0 голосов
/ 17 января 2020

Ваш класс OrdersList не содержит List. Если вы изменяете OrdersList так, чтобы он выглядел так:

import java.util.Collections.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.Getter;
import lombok.Setter;

@JsonTypeName("orders")
@Setter
@Getter
public class OrdersList {

    private List<Order> ordersList;
}

Это должно работать.

И что я бы предпочел сделать, это принять список заказов в контроллере

@RestController
public class Controller {

    @Autowired
    BasicAuth basicAuth;

    @GetMapping("/lok")
    @ResponseStatus(HttpStatus.FOUND)
    public ResponseEntity<List<Order>> getBasicAut(List<Order> ordersList){

        return basicAuth.orderDetails(ordersList);
    }
}

А затем передайте заказы так:

[
    {
      "id": 2039665099999,
      "email": "isx@gmail.com"
    },
    {
      "id": 2039665066666,
      "email": "yzy@gmail.com"
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...