在处理过程中发生错误时休息控制器应该如何表现
How should behave rest controller when during a processing occur a error
我有感兴趣的问题。
假设我有一些休息控制器和一些休息客户端在 javascript 中编写。该客户端向控制器发送请求,并在处理过程中发生一些错误。在这种情况下控制器应该如何表现? return 应该为空吗?或带有消息的字符串?
例如,我们有这样的控制器:
@RequestMapping("/user", method = RequestMethod.POST)
public @ResponseBody String createUser(User user) {
try {
userService.create(user);
} catch(UserCreationException e) {
}
}
这是一个非常简单的例子,但是有许多不同的控制器例子,比如控制器 return 一些资源或者只改变服务器端的状态,我不知道发生错误时该怎么做。
您真的应该使用 HTTP 错误代码并使用您的客户端技术处理 HTTP error codes,即。 JavaScript 你的情况。
例如:给定一个未授权 read/access 资源的用户,则应将 403 错误代码 return 发送到客户端。通过使用标准 HTTP/REST 错误代码,您符合任何客户端都可以理解的 API,无论是 JavaScript 还是其他。
使用 Spring MVC 和 Rest 控制器,这真的很容易。为您的异常创建一个简单的 class 并使用 HTTP 错误代码注释 class,例如@ResponseStatus(value = HttpStatus.FORBIDDEN)
表示 403 错误。然后在您的控制器中,您可以抛出异常 return HTTP 错误代码。
根据http specifications, the server must return a error code >= 500处理过程中出现内部错误。
如果错误是因为客户端做了一个错误的请求:服务器必须return一个error code >= 400 and < 500
当然,在客户端,您必须注意正确处理这些错误(即显示友好的错误消息或类似信息)。
为了改善开发人员(您的消费者)的体验,除了 Http 状态代码之外,在响应正文中使用适当的错误消息进行响应是个好主意。
这里有一个例子spring,主要是抛出一个异常,你可以通过扩展ResponseEntityExceptionHandler@ControllerAdvice
来处理
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException{
private static final long serialVersionUID = 1L;
public ResourceNotFoundException(String message) {
super(message);
}
}
@Controller
@RequestMapping("/XXXXXs")
public class DoctypesController {
@RequestMapping( method = RequestMethod.GET , value="/xxx")
public ResponseEntity<?> getXXXXXX(HttpServletRequest request) {
if (XXX == null ) {
throw new ResourceNotFoundException("XXXX Not found for);
}else{
response = buildResponse(xxxx)
}
return response;
}
}
@ControllerAdvice
public class XXXXEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { ResourceNotFoundException.class })
protected ResponseEntity<Object> handleMissingResource(RuntimeException ex, final WebRequest request) {
HttpStatus status = HttpStatus.NOT_FOUND;
return new ResponseEntity<Object>(new Error(String.valueOf(status.value()), status.getReasonPhrase(),ex.getMessage()),status);
}
}
我有感兴趣的问题。
假设我有一些休息控制器和一些休息客户端在 javascript 中编写。该客户端向控制器发送请求,并在处理过程中发生一些错误。在这种情况下控制器应该如何表现? return 应该为空吗?或带有消息的字符串?
例如,我们有这样的控制器:
@RequestMapping("/user", method = RequestMethod.POST)
public @ResponseBody String createUser(User user) {
try {
userService.create(user);
} catch(UserCreationException e) {
}
}
这是一个非常简单的例子,但是有许多不同的控制器例子,比如控制器 return 一些资源或者只改变服务器端的状态,我不知道发生错误时该怎么做。
您真的应该使用 HTTP 错误代码并使用您的客户端技术处理 HTTP error codes,即。 JavaScript 你的情况。
例如:给定一个未授权 read/access 资源的用户,则应将 403 错误代码 return 发送到客户端。通过使用标准 HTTP/REST 错误代码,您符合任何客户端都可以理解的 API,无论是 JavaScript 还是其他。
使用 Spring MVC 和 Rest 控制器,这真的很容易。为您的异常创建一个简单的 class 并使用 HTTP 错误代码注释 class,例如@ResponseStatus(value = HttpStatus.FORBIDDEN)
表示 403 错误。然后在您的控制器中,您可以抛出异常 return HTTP 错误代码。
根据http specifications, the server must return a error code >= 500处理过程中出现内部错误。
如果错误是因为客户端做了一个错误的请求:服务器必须return一个error code >= 400 and < 500
当然,在客户端,您必须注意正确处理这些错误(即显示友好的错误消息或类似信息)。
为了改善开发人员(您的消费者)的体验,除了 Http 状态代码之外,在响应正文中使用适当的错误消息进行响应是个好主意。
这里有一个例子spring,主要是抛出一个异常,你可以通过扩展ResponseEntityExceptionHandler@ControllerAdvice
来处理@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException{
private static final long serialVersionUID = 1L;
public ResourceNotFoundException(String message) {
super(message);
}
}
@Controller
@RequestMapping("/XXXXXs")
public class DoctypesController {
@RequestMapping( method = RequestMethod.GET , value="/xxx")
public ResponseEntity<?> getXXXXXX(HttpServletRequest request) {
if (XXX == null ) {
throw new ResourceNotFoundException("XXXX Not found for);
}else{
response = buildResponse(xxxx)
}
return response;
}
}
@ControllerAdvice
public class XXXXEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { ResourceNotFoundException.class })
protected ResponseEntity<Object> handleMissingResource(RuntimeException ex, final WebRequest request) {
HttpStatus status = HttpStatus.NOT_FOUND;
return new ResponseEntity<Object>(new Error(String.valueOf(status.value()), status.getReasonPhrase(),ex.getMessage()),status);
}
}