fas*_*ser 6 java ajax spring jackson
我有大约50个使用@ResponseBody注释的控制器.
像这样:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public @ResponseBody Object getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return object;
}
Run Code Online (Sandbox Code Playgroud)
有时候getObject方法返回null.问题是在客户端我得到空响应而不是null.
在初始实现中,我们有自定义JsonView对象,它作为包装器而没有@ResponseBody注释.
像这样:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public JsonView<Object> getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return new JsonView(object);
}
Run Code Online (Sandbox Code Playgroud)
所以它工作正常.
我找到了一些解决方案如何覆盖Jackson 2.0中的null序列化器?但不幸的是,它仅适用于POJO中的字段.
您有什么想法可以处理吗?
提前致谢!
这不是一个需要解决的小问题.
Spring有一个共同的模式,如果一个处理程序方法返回null,它意味着指示处理程序已经处理了生成和编写适当的响应内容,并且前面不需要进一步的操作.
Spring在其RequestResponseBodyMethodProcesser(HandlerMethodReturnValueHandler实现@ResponseBody)中应用了这种模式.它检查返回值是否为null.它将请求设置为已处理.如果返回值不是null,则尝试使用适当的序列化它HttpMessageConverter.
一种选择是创建自己的@ResponseBodyNull注释和相应的HandlerMethodReturnValueHandler,除了处理之外,它们也是相同的null.请注意,您不一定能重复使用代码,RequestResponseBodyMethodProcess因为有些代码HttpMessageConverters会尝试使用失败null.
另一个类似的选项是覆盖RequestResponseBodyMethodProcessor接受null(具有上述限制)并明确地将其注册RequestMappingHandlerMapping,覆盖默认值HandlerMethodReturnValueHandlers.你必须小心地这样做(即注册相同的),除非你想失去功能.
IMO的更好解决方案是不在null响应机构中处理.如果getObject不返回任何东西,那对我来说就好像是404.设置适当的响应代码,瞧!
您始终可以将其注入HttpServletResponse到处理程序方法中并执行类似的操作
Object object = getObject(..);
if (object == null) {
response.getWriter().print("null");
// also set the content type to application/json
}
return object;
Run Code Online (Sandbox Code Playgroud)
假设您知道必须将其序列化为JSON.
| 归档时间: |
|
| 查看次数: |
8878 次 |
| 最近记录: |