java - 具有 null 返回值的 Spring Ajax @ResponseBody

标签 java ajax spring jackson

我有大约五十个使用@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(@ResponseBodyHandlerMethodReturnValueHandler 实现)中应用了此模式。它检查返回值是否为 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/

相关文章:

javascript - 自动完成如何填写另一个表单输入

javascript - 获取ajax历史

php - 如何在 symfony 4 上检索表单 ajax 请求的发布数据?

spring - Heroku 应用程序拒绝启动,因为它无法加载 kotlin.jvm.internal.Intrinsics

java - 如何在像Visual Studio这样的IDE(Eclipse、Spring Tool Suite)中调试Java代码?

java - JacocoReport 配置的 Gradle 6.0 弃用警告

java - applicationContext.xml bean 的 swing 编辑器 ui?

java - Smack API 抛出 item-not-found(404) 异常

java - 如何根据延迟找到最近的机器

spring - 无法使 EnableOauth2Sso 工作 - BadCredentialsException : Could not obtain access token