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定义
然后你可以确定你正在处理上面提到的问题.
另请注意,如果已为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.
如果使用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时,这样做非常容易,然后您在寻找错误原因的同时会花费很多时间,而只有非常无用的异常消息作为帮助。
| 归档时间: |
|
| 查看次数: |
75801 次 |
| 最近记录: |