如何向我的 Spring MVC REST 服务添加错误?
Posted
技术标签:
【中文标题】如何向我的 Spring MVC REST 服务添加错误?【英文标题】:How do I add errors to my Spring MVC REST Service? 【发布时间】:2013-06-03 20:59:06 【问题描述】:如果用户没有输入我正在编码的两个名称,我如何从 Spring MVC 更改/更新以下 REST 调用以返回错误......类似于 NOT FOUND 的东西?
@RequestMapping(value = "/name", method = RequestMethod.GET)
@ResponseBody
public User getName(@PathVariable String name, ModelMap model)
logger.debug("I am in the controller and got user name: " + name);
/*
Simulate a successful lookup for 2 users, this is where your real lookup code would go
*/
if ("name2".equals(name))
return new User("real name 2", name);
if ("name1".equals(name))
return new User("real name 1", name);
return null;
【问题讨论】:
【参考方案1】:定义一个新的异常类,例如ResourceNotFoundException
并从带注释的控制器方法 getName
中抛出一个实例。
然后还在 Controller 类中定义一个带注释的异常处理程序方法来处理该异常,并返回一个 404 Not Found 状态代码,可能会记录它。
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public void handleResourceNotFoundException(ResourceNotFoundException ex)
LOG.warn("user requested a resource which didn't exist", ex);
甚至返回一些错误信息,使用@ResponseBody 注解:
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ResponseBody
public String handleResourceNotFoundException(ResourceNotFoundException ex)
return ex.getMessage();
【讨论】:
但是我怎么把它发回给客户呢?你有这方面的例子吗 spring 会为您解决这个问题。阅读文档:static.springsource.org/spring/docs/3.1.x/… 我没有在页面上看到它..我错过了什么..我如何告诉客户呼叫不正确? 如果我这样做,那么客户端将返回 java.lang.NullPointerException.. 我想学习如何将错误传递回客户端 REST 服务的客户端将是一些软件 - 因此对 HTTP 状态 404 完全满意,不需要更多。【参考方案2】:您可以创建一个专门用于返回错误响应的对象。这样,你就可以说任何你想说的。例如:
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<ResponseStatus> handleHttpMessageNotReadableException(HttpMessageNotReadableException ex)
ResponseStatus responseStatus = new ResponseStatus("400", "Bad Request. " + ex);
responseStatus.setResponseStatusTime(timestampService.createTimestamp());
HttpStatus status = HttpStatus.BAD_REQUEST;
ResponseEntity<ResponseStatus> response = new ResponseEntity<ResponseStatus>(responseStatus, status);
return response;
在此示例中,您可以看到有一个 ResponseStatus 对象。此对象包含状态代码、状态消息、日期和时间的字段。您可能不需要日期和时间,但我发现当有人向我发送他们看到的错误时它很有用,因为这样很容易在我们的服务器日志中准确追踪它发生的位置。
【讨论】:
ResponseStatus
是你自己的班级,对吧?因为Spring有一个ResponseStatus
注解。以上是关于如何向我的 Spring MVC REST 服务添加错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何访问 Spring MVC REST 控制器中的 HTTP 标头信息?
如何正确实现使用 Spring MVC\Boot 返回图像列表的 REST 服务?
Spring MVC 和 Spring REST 的 Spring Security