我是RESTful Web服务的新手,我正在学习Web服务的Spring实现。
我对学习如何在大多数用例中正确使用ResponseEntity返回类型特别感兴趣。
我有一个端点:
/myapp/user/{id}
此端点支持GET
请求,并将返回ID为{id}
的User对象的JSON格式字符串。我计划将控制器方法注释为生成JSON。
如果存在ID为{id}
的用户,我将状态设置为200,并在正文中设置用户的JSON字符串。
如果没有用户存在该ID,我将返回一些400错误的味道,但我不确定在ResponseEntity的主体中设置什么。由于我将端点方法注释为生成JSON,我是否应该提出表示错误的通用POJO,并将其作为JSON返回?
答案 0 :(得分:1)
您不需要使用通用Pojo,使用RequestMapping可以为每个Http代码创建不同的响应。在这个例子中,我将展示如何控制错误并相应地给出响应。
这是具有服务规范的RestController
@RestController
public class User {
@RequestMapping(value="/myapp/user/{id}", method = RequestMethod.GET)
public ResponseEntity<String> getId(@PathVariable int id){
if(id>10)
throw new UserNotFoundException("User not found");
return ResponseEntity.ok("" + id);
}
@ExceptionHandler({UserNotFoundException.class})
public ResponseEntity<ErrorResponse> notFound(UserNotFoundException ex){
return new ResponseEntity<ErrorResponse>(
new ErrorResponse(ex.getMessage(), 404, "The user was not found") , HttpStatus.NOT_FOUND);
}
}
在getId方法中,如果customerId&lt; 10它应该响应客户ID作为正文消息的一部分,但是当客户大于10时应该抛出异常,在这种情况下服务应该响应ErrorResponse。
public class ErrorResponse {
private String message;
private int code;
private String moreInfo;
public ErrorResponse(String message, int code, String moreInfo) {
super();
this.message = message;
this.code = code;
this.moreInfo = moreInfo;
}
public String getMessage() {
return message;
}
public int getCode() {
return code;
}
public String getMoreInfo() {
return moreInfo;
}
}
最后我使用了一个特定的Exception来查找“Not Found”错误
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
答案 1 :(得分:0)
如果没有用户存在该ID,我将返回 一些400错误的味道,但我不知道在体内设置什么 ResponseEntity。因为我将端点方法注释为 生成JSON,我应该想出一个代表的通用POJO 一个错误,并将其作为JSON返回?
这绝对是一种可行的解决方案,如果你想添加例如请求失败的一个更具体的原因,或者您想要添加特定的I18N消息,或者只是想要通知您的API以提供一些抽象结构。
我自己更喜欢@Herr Derb提出的解决方案,如果没有任何回报,请不要退货。返回的数据可能完全没有必要/未使用,如果返回代码不是2XX,接收者可能只是丢弃它。
这可能是相关的: http://www.bbenson.co/post/spring-validations-with-examples/ 作者描述了如何验证传入模型并构建一般错误响应。也许这是你想做的事情......