如果领先的驼峰式案例单词只有一个字母长,为什么杰克逊2无法识别第一个大写字母?
我正在将Spring 4 MVC与Jackson
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响应,说该字段未被识别,并且从未调用我的控制器类:
无法读取JSON:无法识别的字段“ aLogId”(类
但是,当我将“ L”更改为小写时,请求将按预期反序列化,并且命中了我的控制器类:
{"alogId":"This is a log id"}
为什么杰克逊希望“ L”明显是驼峰式惯例中该属性的第二个单词,并且希望大写呢?是否因为第一个单词只有一个字母长?
请求对象中还有其他属性,其中第一个单词不只一个字母,并且所赋予的那些属性也不会因不匹配而遇到相同的问题。
回答:
您看到的问题是由于Jackson使用Java Bean命名约定来弄清楚Java类中的Json属性。
下面是一个参考,你看到的具体问题,建议不大写没有在你的领域的前两个字母。如果您使用诸如IntelliJ或eclipse之类的IDE,并让IDE为您生成设置器,您会注意到发生了同样的“行为”,最终将得到以下方法:
public void setaLogId(String aLogId) { this.aLogId = aLogId;
}
public String getaLogId() {
return aLogId;
}
因此,当您将“ L”更改为小写字母时,Jackson就能弄清楚要映射的字段。
上面已经说了,您仍然可以选择使用“
aLogId”字段名称,并使Jackson运行所有您需要做的就是使用其中的@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();
}
}
}
测试的输出为:
Serialization test: {"aLogId":"anId"}
Deserialization test: anotherId
以上是 如果领先的驼峰式案例单词只有一个字母长,为什么杰克逊2无法识别第一个大写字母? 的全部内容, 来源链接: utcz.com/qa/430199.html