Jackson InvalidTypeIdException при использовании JSON, сопоставленного с Hibernate Entity с другими ссылками на Entity в Spring Boot Rest Controller - PullRequest
0 голосов
/ 30 января 2019

Я занимаюсь разработкой веб-сервиса REST, и у меня есть следующее:

Item.java

@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "item_generator")
    @SequenceGenerator(name="item_generator", sequenceName = "base.item_seq")
    @Column(name = "id")
    private long id;

    @Column(name = "item_name")
    private String itemName;

    @JsonIgnore
    @JsonManagedReference
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinTable(
        name="join_category_item",
        joinColumns = @JoinColumn(name="item_id"),
        inverseJoinColumns = @JoinColumn(name="category_id")
    )
    private Category category;
}

Category.java

@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
public class Category implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "category_generator")
    @SequenceGenerator(name="category_generator", sequenceName = "base.category_seq")
    @Column(name = "id", nullable = false)
    private long id;

    @Column(name = "category_name")
    private String categoryName;

    @JsonBackReference
    @OneToMany(mappedBy = "category")
    @Fetch(FetchMode.JOIN)
    private Collection<Item> items;
{

Класс контроллера:

@PostMapping(value = "/create",
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<Item> createItem(@RequestBody Item item) {
   // some logic here...
}

Итак, моя проблема в том, что когда я пытаюсь вызвать @PostMapping из @Controller с помощью этого json:

{
    "Item": {
        "itemName": "Item name",
        "category": {
            "categoryName": "Category Name"
        }
    }
}

Я получаю следующую ошибку:

"[http-nio-8080-exec-6] ПРЕДУПРЕЖДЕНИЕ org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - решено [org.springframework.http.converter.HttpMessageNotReadableException: не может быть исключено: JSONразрешить идентификатор типа 'categoryName' как подтип [простой тип, класс com.test.Category]: известный тип id = [Category] (для свойства POJO 'category'); вложенное исключение - com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Не удалось разрешить идентификатор типа 'categoryName' как подтип [простой тип, класс com.test.Category]: известный тип ids = [Category] (для свойства POJO 'category') в [Source: (PushbackInputStream);строка: 5, столбец: 4](через цепочку ссылок: com.test.Item ["category"])] "

Также с использованием

{...," Category ": {"categoryName ":" Имя категории "}}

в моем json (Capital C) не выдает исключение, а просто вводит пост-отображение с нулевой категорией.

Спасибозаранее.

1 Ответ

0 голосов
/ 31 января 2019

Удалите аннотации @JsonTypeInfo, я не думаю, что они нужны для структуры json, которую вы пытаетесь использовать.Они подразумевают, что между Item и Category есть иерархия наследования, которой нет, Item просто имеет ссылку на Category.

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