我有restful API并使用Jetty作为服务器。我发送一个发布请求来创建包含一些技能
列表的对象。 Skill 包含 String
id 和 Integer
value 字段。当我使用 0
或 "0"
作为我的整数字段并获取响应时,我得到的技能数组根本没有 value 字段。
@XmlRootElement
@JsonAutoDetect(isGetterVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE,
creatorVisibility = Visibility.NONE, fieldVisibility = Visibility.NONE)
public class Skill
{
@com.fasterxml.jackson.annotation.JsonProperty(value="id")
@javax.validation.constraints.NotNull
private java.lang.String _id;
@com.fasterxml.jackson.annotation.JsonProperty(value="value")
@javax.validation.constraints.NotNull
private java.lang.Integer _value;
// getters and setters
}
我的请求正文是这样的:
{
// some other fields
"skills": [{
"id":"Swedish",
"value":0
},{
"id":"Finnish",
"value":"0"
}]
}
对我的对象进行必要的更改后,我将其传递给通过此行返回:
Response.ok().entity(myObject).build();
获取响应的正文如下:
{
// some other fields
"skills" : [ {
"id" : "Finnish"
}, {
"id" : "Swedish"
} ]
}
使用其他值一切正常,但是,0 似乎很特殊,它甚至不将该字段包含到对象中。
问题是为什么以及如何解决它?
最佳答案
问题不在于 Jetty、Jersey 或 YaaS。问题似乎出在 jackson 身上。 Jackson 进行了序列化/反序列化,并且似乎进行了一些优化,因此跳过了零。
不幸的是,我还没有找到任何资源来准确说明为什么要跳过 0,并且我没有设法在 Jackson 代码中找到发生这种情况的位置。
可能的解决方案:
- 为您的字段使用注释
@JsonInclude(JsonInclude.Include.ALWAYS)
,它不会被跳过。 Integer
字段不允许有零。- 使用
String
类型而不是Integer
。
问题是我的对象是由 YaaS 生成的,因此,我不能只通过生成的对象进行更改,并且不确定 YaaS 是否有可能生成带有第 1 项注释的对象。我认为在这种情况下,2 个选项可能是最好的。
关于java - 响应不包含零整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36625457/