0
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public List<Country> getListOfCountries() {

    return countryService.listAll();
}

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

4

2 回答 2

2

我认为你有几个选择:

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

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

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

于 2013-01-09T22:47:09.953 回答
2

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

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

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

我想在 Spring 3.2 中补充一点(在 Spring 3.2 之前的返回响应正文很复杂),您可以设置一个@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注释的类中。

有关详细信息,请参阅http://static.springsource.org/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlershttp://www.springsource.org/node/3738了解 3.2 具体内容

于 2013-01-09T23:44:30.817 回答