我有大约五十个使用@ResponseBody 注释的 Controller 。
像这样:
@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public @ResponseBody Object getObject(@RequestParam("id") Long id) {
Object object = provider.getObject(id);
return object;
}
有时 getObject 方法返回 null
。问题是在客户端,我得到的是 empty response 而不是 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);
}
所以它工作正常。
我在 How do you override the null serializer in Jackson 2.0? 找到了一些解决方案但不幸的是,它仅适用于 POJO 中的字段。
您对如何处理它有任何想法吗?
提前致谢!
最佳答案
这不是一个需要解决的小问题。
Spring 有一个通用模式,如果处理程序方法返回 null
,则表示处理程序已经处理了生成和写入适当的响应内容,不需要进一步操作在前面。
Spring 已在其RequestResponseBodyMethodProcesser
(@ResponseBody
的HandlerMethodReturnValueHandler
实现)中应用了此模式。它检查返回值是否为 null
。它将请求设置为已处理。如果返回值不是 null
,它会尝试使用适当的 HttpMessageConverter
对其进行序列化。
一个选项是创建您自己的 @ResponseBodyNull
注释和相应的 HandlerMethodReturnValueHandler
,除了处理 null
外,它的作用相同。请注意,您不一定要重用 RequestResponseBodyMethodProcess
中的代码,因为某些 HttpMessageConverters
会在尝试使用 null
时失败。
另一个类似的选项是覆盖 RequestResponseBodyMethodProcessor
以接受 null
(具有上述限制)并使用您的 RequestMappingHandlerMapping
显式注册它,覆盖默认的 HandlerMethodReturnValueHandler
。你必须小心地做这件事(即注册相同的),除非你想失去功能。
在我看来,更好的解决方案是不处理响应正文中的 null
。如果 getObject
没有返回任何东西,那对我来说就像是 404。设置适当的响应代码,瞧!
您始终可以将 HttpServletResponse
注入(inject)到您的处理程序方法中并执行类似的操作
Object object = getObject(..);
if (object == null) {
response.getWriter().print("null");
// also set the content type to application/json
}
return object;
假设您知道这必须序列化为 JSON。
关于java - 具有 null 返回值的 Spring Ajax @ResponseBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25650356/