【问题标题】:Spring mvc controller null return handlerSpring mvc 控制器空返回处理程序
【发布时间】:2013-01-09 21:49:02
【问题描述】:
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public List<Country> getListOfCountries() {

    return countryService.listAll();
}

它显示对象的 json 视图,但如果服务返回 null,那么我想显示一条错误消息,有什么建议吗?

【问题讨论】:

  • 这应该可以在 OTB 中使用,因为 Jackson 不会转换为 null(上次我检查过)。也就是说,如果您的请求接受内容类型是application/json,您将收到一个错误,但不是一个理想的错误。它可能显示为空字符串的原因是您发送了错误的接受 mime 类型。但是你真的不应该像其他人所说的那样返回null

标签: spring hibernate model-view-controller


【解决方案1】:

首先,即使这不能直接回答问题,您的对象也不应该返回 null 而不是空集合 - 您可以在 Effective Java 2nd Edition,第 43 条 / p 中找到原因.201

因此,如果没有找到国家的情况是正常的,则必须由客户端JS代码处理,该代码将检查计数并显示相应的消息。

如果出现问题,您可以抛出异常(正如 Biju 指出的 +1) - 我相信应该抛出异常的是服务,因为它知道发生异常的原因,并且无论如何都不返回 null。

我想在 Spring 3.2 中补充一点(在 Spring 3.2 之前的返回响应正文是 complicated),您可以设置一个 @ExceptionHandler,它既可以返回 JSON,也可以设置 HTTP 状态代码,稍后可以通过客户端。我认为在这里返回带有一些错误代码的自定义 JSON 响应是最佳选择。

    @RequestMapping("/test")
    @ResponseBody
    public List<Country> getListOfCountries() {
        //assuming that your service throws new NoCountriesFoundException();
            //when something goes wrong
            return countryService.listAll();
    }

    @ExceptionHandler(NoCountriesFoundException.class)
    ResponseEntity<String> test() {
        return new ResponseEntity<String>(
                "We are sorry, our server does not know any countries yet.",
                HttpStatus.I_AM_A_TEAPOT  );
    }

然后在JS代码中,可以根据返回的状态码做具体的处理。

另外,为了避免在不同的控制器中声明相同的 @ExceptionHandler,在 Spring 3.2 中,您可以将 @ExceptionHandler 放在 @ControllerAdvice 注释类中。

3.2具体的东西见http://static.springsource.org/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlershttp://www.springsource.org/node/3738

【讨论】:

  • +1 他还应该将他的响应转换器配置为不允许返回null(即禁用 StringConverter),但是 IIRC 这需要在 mvc 消息转换器中进行一些痛苦的配置。如果他的 AJAX 正确设置了 Content Type,它应该会失败,因为 Jackson 不支持返回 null。
  • 如果服务中发生异常,@ExceptionHandler 是否会在控制器上捕获?
  • @user1827614 如果异常发生在服务方法中,它会沿着堆栈向下传播到控制器方法(当然如果服务方法是从控制器调用的)。
【解决方案2】:

我认为你有几个选择:

  1. 如果你返回一个空值,它将作为一个空字符串“”返回,你可能可以查找并处理它。

  2. 在您的列表顶部返回一个包装器类型,这样如果包装的列表为空,则类似这样的内容将返回给客户端{"countries":null},这可以在 javascript 端更轻松地处理。

  3. 抛出异常,该异常将作为 500 状态代码传播回客户端,然后您可以在 javascript 端使用错误处理程序来处理这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多