JSON请求如下:
{ "firstName": "Test", "lastName": "1", "isActive": 1 }
持久化对象isActive如下:
private boolean isActive;
Controller如下:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Object projectDetails(@PathVariable("id") String id, @AuthenticationPrincipal UserInfo userInfo) {
if (null == userInfo) {
throw new BizException(ErrorCode.ACCESS_DENIED, "用户不存在");
}
return projectInfoService.findOneAndTransformToVo(id, userInfo.getUserId());
}
每次请求获得详细信息的时候都是isActive显示false,
public void setFirstName(String firstName) {} public String getFirstName() { return firstName; }
public void setLastName(String lastName) {} public String getLastName() { return lastName; }
public void setActive(boolean isActive) {} public boolean isActive() { return isActive; }
由此可以看出firstName和lastName是可以被映射的但是boolean型的isActive就没有被映射了,因为Jackson解析的时候取决于java Bean的getter方法和setter方法,所以网上说的是有两种方法来解决这种问题,第一种是在你的field上用@JsonProperty声明该字段,但是我亲自试了,并没有作用。
org.codehaus.jackson.annotate.JsonProperty和com.fasterxml.jackson.annotation.JsonProperty都不起作用。
说说可行的方法吧,如下:
public boolean getIsActive() {
return isActive;
}
public void setIsActive(boolean isActive) {
this.isActive = isActive;
}
这种方式才能设置和获得正确的值。
上传一张图,可以看到Boolean和boolean区别:
这是自动生成的代码,所以大家在写的时候要注意,要Jackson解析会出错,也就是拿不到设置的值。
顺便提一下:Java生成Boolean对象的三种方法之比较
Java生成Boolean对象的第一种常见方法是通过new操作符
Boolean boolean1 = new Boolean(1==1);
第二种是通过静态方法valueOf
Boolean boolean1 = Boolean.valueOf(1==1);
第三种是JDK1.5之后的自动装箱
Boolean boolean1 = 1==1;
这三种方法有什么区别呢?
先看一段代码
Boolean[] boolean1 = new Boolean[100];
Boolean[] boolean2 = new Boolean[100];
Boolean[] boolean3 = new Boolean[100];
for (int i = 0; i < 100;i++){
boolean1[i] = Boolean.valueOf(1==1);
}
for (int i = 0;i < 100;i++){
boolean2[i] = new Boolean(1==1);
}
for (int i = 0; i < 100;i++){
boolean3[i] = 1==1;
}
System.out.println("valueOf: " + String.valueOf(boolean1[1] == boolean1[2]));
System.out.println("new Boolean: " + String.valueOf(boolean2[1] == boolean2[2]));
System.out.println("auto wrap: " + String.valueOf(boolean3[1] == boolean3[2]));
输出结果是:
valueOf: true
new Boolean: false
auto wrap: true
为什么会这样呢?
原因就在于用new创建的Boolean对象是不断的新创建一个实例对象,而valueOf则是返回Boolean类里的静态成员变量,不会产生大量相同的实例变量。自动包装和valueOf类似.
实际上jdk文档也是建议用valueOf代替new方式来创建Boolean类对象。
boolean是基本数据类型
Boolean是它的封装类,和其他类一样,有属性有方法,可以new,例如:
Boolean flag = new Boolean("true"); // boolean 则不可以!
Boolean 是boolean 的实例化对象类,和Integer对应int一样。
自jdk1.5.0以上版本后,Boolean在"赋值"和判断上和boolean一样。
即是你: boolean b1 = true ; 或者 Boolean b2 = true ; 都可以。