【问题标题】:How to create Custom Response Handler in Spring MVC?如何在 Spring MVC 中创建自定义响应处理程序?
【发布时间】:2014-09-09 14:17:33
【问题描述】:

我有大约 50 个弹簧控制器,它们可以在响应中返回 null。像这样:

@RequestMapping(value = "/someUrl.controller", method = RequestMethod.GET)
public @ResponseBody Object getObject(@RequestParam("id") Long id) {
    Object object = provider.getObject(id);
    if (object == null ) {
        return throw new EntityNotFoundException();
    } else {
        return object;
    }
}

@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(EntityNotFoundException.class)
public @ResponseBody ExceptionDetails handleEntityNotFound(EntityNotFoundException e) {
    return createErrorJsonView(e);
}

我的目标是避免对每个控制器进行空检查,并为这种情况创建一些通用异常处理程序

据我了解,重写 HandlerMethodReturnValueHandler 弹簧处理程序不是一个好主意。

你有什么想法吗?

谢谢!

【问题讨论】:

  • 您可以在provider.getObject(id) 函数中执行空检查并从那里抛出异常。
  • 这个@ExceptionHandler 有什么问题?还是您不想将所有处理程序重构为throwEntityNotFoundException?您应该考虑在某些情况下返回 null 是有效的这一事实。
  • 其实,我想我应该总是在返回null时处理这种情况,因为spring将这个null转换为空响应。事实上,我对 jquery 库有疑问,因为它希望得到可以解析的东西。 Mo 的目标是避免在所有控制器中检查空值。在这种情况下,我可以使用 @ControllerAdvice 注释创建一些通用错误处理程序。
  • 另外,我有很多不同的 DAO 类和另一个经理。因此,我无法在 provider.getObject(id) 函数中处理这种行为。

标签: java spring-mvc error-handling


【解决方案1】:

对于异常处理程序,您需要一个 @ControllerAdvice 对象并在那里注册您的处理程序:

@ControllerAdvice
class GlobalControllerExceptionHandler {


    @ResponseStatus(HttpStatus.NOT_FOUND) 
    @ExceptionHandler(EntityNotFoundException.class)
    public @ResponseBody ExceptionDetails handleEntityNotFound(EntityNotFoundException e) {
        return createErrorJsonView(e);
    }

}

您可以在此处找到更多详细信息: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

同样,您应该探索使用@Initbinder 来水合和验证您的模型对象。

【讨论】:

  • 其实我知道如何创建全局处理程序,问题是如何避免在所有控制器中进行空检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2012-09-25
相关资源
最近更新 更多