Spring mvc controller null返回处理程序

时间:2013-01-09 21:49:03

标签: spring hibernate model-view-controller

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

    return countryService.listAll();
}

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

2 个答案:

答案 0 :(得分:2)

我认为你有几个选择:

  1. 如果返回null,它将作为空字符串返回“”,您可以查找并处理它。

  2. 在列表顶部返回一个包装类型,这样如果包装列表为null,则会返回到客户端{"countries":null},这样可以在javascript端更容易处理。

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

答案 1 :(得分:2)

首先,即使这不直接回答问题,你的对象也不应该返回 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带注释的类中。

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