web后端

HTTP Status 500 - Could not writ

2018-12-19  本文已影响0人  ForeThought

后台查询数据向前端返回数据时报错:
HTTP Status 500 - Could not write content****

1,原因:

执行对应的sql发现有一个字段查出来时是null的,
而封装到某个对象中时,并未给属性是否为null,检测,如果为null就赋予一个符合该属性类型的值,即可。


   if (!Objects.isNull(row[8])) {
            tempOrderId = (Integer) row[8];
        } else {
            tempOrderId = 0;
        }

2,疑问

比较奇特的是:debug看见数据已经被封装到对象中,但是在controller层转为json就抛异常了
如下图:


图片.png

详细异常信息:

HTTP Status 500 - Could not write content: (was java.lang.NullPointerException) (through reference chain: com.werun.template.common.utils.BaseObjectResult["data"]->com.werun.template.api.model.OrderModifyNoticeDetailResultBean["tempOrderId"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.werun.template.common.utils.BaseObjectResult["data"]->com.werun.template.api.model.OrderModifyNoticeDetailResultBean["tempOrderId"])

为什么会这样呢?按照报错信息翻译是databind异常了,

3,这条数据可是有10多个字段,难道每个字段去加if和else?

再回到代码中:
发现数据类型都是使用的封装类型Integer,但是没有改变setter、getter

public int getTempOrderId() {
        return tempOrderId;
    }
    public void setTempOrderId(int tempOrderId) {
        this.tempOrderId = tempOrderId;
    }

java类转为json类是通过getter方法来生成json的具体属性的,getXXX 就会生成一个XXX的json串的属性

4,真实原因:

这里由于 属性 tempOrderId 是Integer类型,并且为null,调用get时会自动拆箱为int,但是null给拆成为int是啥效果呢?
可以写代码试试:

   @Test
    public void testInteger(){
        Integer a=null;
        int b=a;
}

控制台输出:

java.lang.NullPointerException
at com.werun.template.common.TestUtil.testInteger(TestUtil.java:797)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),

5,验证

为了验证猜想:将getter的返回参数有int改为Integer(只更改getter返回值类型)

public Integer getTempOrderId() {
        return tempOrderId;
    }
    public void setTempOrderId(int tempOrderId) {
        this.tempOrderId = tempOrderId;
    }

测试:
{
"message": "获取成功",
"data": {
"noticeId": 164,
"noticeNum": "1545132031742",
"noticeTime": 1545132031740,
"noticeTypeCode": "14010",
"noticeTypeName": "订单中止审核",
"modifierId": 272,
"modifierName": "张三",
"orderId": 13,
"tempOrderId": null,//这个字段在作怪
"orderNum": "K1,0,501",
"clientId": 11,
"clientName": ",,,,,测试",
"orderStatusCode": ",,,",
"orderStatusName": ",,,",
"modifyContent": ",,,",
"remarks": "设计主管处 同意终止订单1363",
"auditResultCode": "1300",
"auditResultName": "接单"
},
"success": true
}

至此问题解决!
包装类型->基本类型可能有问题
基本类型->包装类型,没问题
6## 总结:
数据库查询出的结果尽量使用包装类型,避免null造成的影响
运算的地方使用基本类型,减少对象的创建

上一篇下一篇

猜你喜欢

热点阅读