Jersey返回http code非200错误陷阱
背景:使用原CloudSOP框架,返回对象被自动格式化成json字符串。换了Jersey框架后,莫名其妙返回204.
通过查看打印日志,发现只要是返回对象为null,必然会返回http 204。
查看源码,JavaResourceMethodDispatcherProvider.TypeOutInvoker.doDispatch方法实现:
final Object o = invoke(resource, getParamValues());
if (o != null) {
Response response = Response.ok().entity(o).build();
// TODO set the method return Java type to the proper context.
// Response r = new ResponseBuilderImpl().
// entityWithType(o, t).status(200).build();
return response;
} else {
return Response.noContent().build();
}
原来Jersey在返回前回判断是否为null,如果是null就返回no content码204。204是通用没有响应内容的http code,可以理解。不过CloudSOP框架之前对null还是返回200,从业务上可以理解,我就是不想返回任何东西,但是处理是成功的。
规避措施:
如果为null,就new 一个对象,这样就是200了,后台和前台也不会异常了。
所以,所有服务返回最好定义一个包装对象ResultInfo,没有返回值也不为null,code为0,message为空。