Spring Rest POST Json RequestBody 不支持内容类型

2022-08-31 14:45:05

当我尝试使用post方法发布新对象时。请求正文无法识别 contentType。Spring已经配置好了,POST可以与其他对象一起使用,但不能与这个特定的对象一起使用。

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

如果我尝试相同的请求,只需更改请求正文对象。它的工作原理。


答案 1

我找到了解决方案。这是因为我有2个同名但类型不同的二传手。

我的类具有id属性int,当à Hibernitify我的对象时,我将其替换为整数。

但显然,我忘了删除二传手,我有:

/**
 * @param id
 *            the id to set
 */
public void setId(int id) {
    this.id = id;
}

/**
 * @param id
 *            the id to set
 */
public void setId(Integer id) {
    this.id = id;
}

当我删除此 setter 时,rest request 工作得很好。

Intead 以抛出取消编组错误或反映类错误。异常 HttpMediaTypeNotSupportedException 接缝在这里真的很奇怪。

我希望这个堆栈溢出可以帮助其他人。

附注

您可以检查Spring服务器控制台是否有以下错误消息:

未能评估 Jackson 反序列化类型 [simple type, class your.package.ClassName]: com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for propertyname

然后,您可以确定您正在处理上述问题。


答案 2

如果您为不在 POST 中发送的参数属性声明了 getter 和 setters(如果未在构造函数中声明,则为事件),也请注意,例如:

@RestController
public class TestController {

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public String test(@RequestBody BeanTest beanTest) {
        return "Hello " + beanTest.getName();
    }


    public static class BeanTest {

        private Long id;
        private String name;

        public BeanTest() {
        }

        public BeanTest(Long id) {
            this.id = id;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

具有下一个结构的帖子请求:{“id”:“1”} 将不起作用,您必须删除 name get 并设置。