JSON请求后默认发送布尔默认值false

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 ; 都可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值