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

Thi*_*aut 53 java spring json spring-mvc jackson

当我尝试使用post方法发布新对象时.RequestBody无法识别contentType.Spring已经配置,POST可以与其他对象一起使用,但不是这个特定的对象.

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
Run Code Online (Sandbox Code Playgroud)

如果我尝试相同的请求只是更改requestbody对象.有用.

Thi*_*aut 71

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

我的类有一个id属性int,当我用Hibernitify我的对象时,我用Integer替换了它.

但显然,我忘了删除setter,我有:

/**
 * @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;
}
Run Code Online (Sandbox Code Playgroud)

当我删除这个setter时,休息重新开始工作非常好.

Intead抛出解组错误或反映类错误.异常HttpMediaTypeNotSupportedException接缝在这里真的很奇怪.

我希望这个stackoverflow可以帮助别人.

边注

您可以检查Spring服务器控制台以获取以下错误消息:

无法为类型[simple type,class your.package.ClassName]评估Jackson反序列化:com.fasterxml.jackson.databind.JsonMappingException:属性"propertyname"的冲突setter定义

然后你可以确定你正在处理上面提到的问题.

  • 我在同样的问题上花了5个小时.我在一个名为'getSerial(...)'的实体上有两个setter.一个人拿了一个'String',另一个拿了'BigInteger'...... (4认同)

alv*_*lla 7

另请注意,如果已为POST中未发送的参数属性声明了getter和setter(如果未在构造函数中声明,则为event),例如:

@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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

具有下一个结构的帖子请求:{"id":"1"}不起作用,您必须删除名称get和set.


Mad*_*vap 5

如果使用lombok,则如果加紧@JsonDeserialize的命名,则会出现该错误,例如:

@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeOtherClassBuilder.class)
public class SomeClass {
    ...
    public static class SomeOtherClassBuilder {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它应该是:

@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeClassBuilder.class)
public class SomeClass {
    ...
    public static class SomeClassBuilder {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当您进行类名的重构而忘记了Builder时,这样做非常容易,然后您在寻找错误原因的同时会花费很多时间,而只有非常无用的异常消息作为帮助。