在处理过程中发生错误时休息控制器应该如何表现

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);
    }
}