我正在使用
Spring 4 MVC与杰克逊2我的服务.对于其中一个操作,我有一个请求对象具有一个属性,其中主要的骆驼情况单词这只是一个字母的长度:
private String aLogId;
这个类有适当命名的getter和setter:
public String getALogId() { return aLogId; } public void setALogId(String aLogId) { this.aLogId = aLogId; }
但是,当我尝试使用相应的JSON属性向该服务发布请求时:
{"aLogId":"This is a log id"}
我收到来自Spring框架的500个响应,表示该字段不被识别,并且我的控制器类从不被调用:
Could not read JSON: Unrecognized field “aLogId” (class
但是,当我将“L”更改为小写时,请求按预期方式反序列化,并且我的控制器类被击中:
{"alogId":"This is a log id"}
为什么杰克逊希望“L”是小写,当它显然是这个属性的骆驼案例惯例的第二个字,意在大写?是因为第一个字只有一个字母长吗?
请求对象中还有其他属性,其中第一个单词多于一个字母,而这些属性不属于与此不匹配的同一问题.
解决方法
您所看到的问题是由于Jackson使用Java Bean命名约定来确定Java类中的Json属性.
这是您看到的具体问题的reference,建议不要将字段中的前两个字母大写.如果您使用像IntelliJ或eclipse这样的IDE,让IDE为您生成setter,您会注意到发生相同的“行为”,您将最终得到以下方法:
public void setaLogId(String aLogId) { this.aLogId = aLogId; } public String getaLogId() { return aLogId; }
因此,当您将“L”更改为小写时,Jackson能够将其显示出您想要映射的字段.
说完上面的话,你仍然可以选择使用“aLogId”字段名称,并且让杰克逊工作所需要做的就是将@JsonProperty注释与其中的aLogId一起使用.
@JsonProperty("aLogId") private String aLogId;
以下测试代码将显示如何运行:
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.ObjectMapper; public class Test { @JsonProperty("aLogId") private String aLogId; public void setaLogId(String aLogId) { this.aLogId = aLogId; } public String getaLogId() { return aLogId; } public static void main(String[] args) { ObjectMapper objectMapper = new ObjectMapper(); Test test = new Test(); test.setaLogId("anId"); try { System.out.println("Serialization test: " + objectMapper.writeValueAsString(test)); String json = "{\"aLogId\":\"anotherId\"}"; Test anotherTest = objectMapper.readValue(json,Test.class); System.out.println("Deserialization test: " +anotherTest.getaLogId()); } catch (Exception e) { e.printStackTrace(); } } }
测试的输出是:
序列化测试:{“aLogId”:“anId”}
反序列化测试:anotherId
希望有帮助,
何塞·路易斯
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。