Spring Boot MVC - 不支持内容类型为“application/json;charset=UTF-8”的请求

5
这个Spring Boot项目中,当我使用Postman进行POST请求(创建新的Item资源)时会出现错误。
Resolving exception from handler 
     [public com.example.demo.resource.Item com.example.demo.controller.ItemController.addItem(com.example.demo.resource.Item)]: 
     org.springframework.web.HttpMediaTypeNotSupportedException: 
     Content type 'application/json;charset=UTF-8' not supported

在请求体中,我复制了一个从GET请求中获取的现有Item(并更改了id和itemName)的代码。
    // Request body:
    {
        "id": 10, // also tried without id field as it's autogenerated
        "itemName": "milk",
        "cart": {
            "id": 1
        }
    }

我确保在Item类中使用正确的getter和setter(因为这是一个已知问题

@Entity
@Table(name="items")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id")
public class Item
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "item_id")
    private long id;

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

    @ManyToOne
    @JoinColumn(name = "cart_id", nullable=false)
    @JsonManagedReference
    private Cart cart;

   //setters and getters
}

这里还有一个名为Cart的类,与Item之间存在多对一的关系。

@Entity
@Table(name="carts")
@JsonIdentityInfo(
          generator = ObjectIdGenerators.PropertyGenerator.class, 
          property = "id")
public class Cart 
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "cart_id")
    private long id;

    @OneToMany(mappedBy = "cart")
    @JsonBackReference
    private Set<Item> items;

    //setters and getters
}

这是ItemController

@RestController
public class ItemController 
{
    private static final Logger LOG = LoggerFactory.getLogger(ItemController.class);

    @Autowired ItemDao dao;

    @GetMapping("items")
    public List<Item> getAll()
    {
        List<Item> res = new ArrayList<>();
        dao.findAll().forEach(res::add);
        return res;
    }

    @PostMapping("items")
    public Item addItem(@RequestBody Item item)
    {
        return dao.save(item);
    }

    @GetMapping("items/{item_id}")
    public Item getItemById(@PathVariable("item_id") long item_id)
    {
        Item item = dao.findById(item_id).get();
        LOG.info(" ---------------- Retrieved item: {}", item.toString());
        return item;
    }
}

编辑

我刚刚注意到似乎前面还有另一个错误:

Failed to evaluate Jackson deserialization for type [[simple type, class com.example.demo.resource.Item]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'defaultReference': back reference type (java.util.Set) not compatible with managed type (com.example.demo.resource.Item)

这是完整的错误信息:
2018-02-27 11:03:09.836  WARN 9640 --- [nio-9200-exec-1] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.example.demo.resource.Item]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'defaultReference': back reference type (java.util.Set) not compatible with managed type (com.example.demo.resource.Item)
2018-02-27 11:03:09.837  WARN 9640 --- [nio-9200-exec-1] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.example.demo.resource.Item]]: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot handle managed/back reference 'defaultReference': back reference type (java.util.Set) not compatible with managed type (com.example.demo.resource.Item)
2018-02-27 11:03:09.838 DEBUG 9640 --- [nio-9200-exec-1] .w.s.m.m.a.ServletInvocableHandlerMethod : Failed to resolve argument 0 of type 'com.example.demo.resource.Item'

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

感谢帮助


请同时分享控制器代码。 - Rakesh
@Rakesh,请查看上面的ItemController(附加的)。 - tenticon
当您发布数据时,请设置contenttype=application/json,忽略字符集并尝试。 - Rakesh
是的,我在Postman中设置的只有Content-Type=application/json - tenticon
尝试将id的类型从long更改为Long,并且在ItemCart类中都更改id的setter/getter。 - tryingToLearn
@theLearner尝试过,但问题仍然存在。 - tenticon
3个回答

6

1
我遇到了相同的问题。 //@JsonBackReference不重要。 删除//@JsonManagedReference,它就可以工作了。

许多:

@JsonBackReference
@OneToMany(targetEntity=Device.class, mappedBy="detectUnit") 
private List<Device> devices;

一:

@ManyToOne
private DetectUnit detectUnit;

POST方法适用于两者。


是的,仅删除@JsonManagedReference将起作用,尽管Jackson Javadoc指出不应在集合上使用@JsonBackReference。无论如何,我建议为实体的CRUD的不同用例创建DTO类,以避免序列化和反序列化问题。 - blackr1234

0

尝试将内容类型从'application/json;charset=UTF-8'替换为'application/json'。我遇到了同样的问题,这个方法解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接