如何处理从RestController

时间:2016-08-09 20:53:40

标签: spring rest web

我已经实现了一个Spring Rest Controller,它使用StreamingResponseBody回送大文件。但是,这些文件来自另一个系统,并且在将它们重新传输时可能会出现问题。发生这种情况时,我抛出一个自定义异常(MyException)。我在@ExceptionHandler实现中处理异常,如下所示。我试图设置响应httpstatus和错误消息但我总是收到http状态406.在返回StreamingResponseBody时处理错误/异常的正确方法是什么?

@ExceptionHandler(MyException.class)
    public void handleParsException( MyException exception, HttpServletResponse response) throws IOException
    {
        response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(),exception.getMessage());
    }

2 个答案:

答案 0 :(得分:1)

您应该以同样的方式处理所有错误。有很多选择。

我更喜欢下一个:

控制器建议

让实体发送通用错误响应是一个好主意,例如:

public class Error {

 private String code;
 private int status;
 private String message;

 // Getters and Setters

}

否则,要处理异常,您应该创建一个使用@ControllerAdvice注释的类,然后创建使用@ExceptionHandler注释的方法以及要处理的异常(可能不止一个)。最后使用您想要的状态代码返回ResponseEntity<Error>

public class Hanlder{

  @ExceptionHandler(MyException.class)
   public ResponseEntity<?> handleResourceNotFoundException(MyException
myException, HttpServletRequest request) {

     Error error = new Error();
     error.setStatus(HttpStatus.CONFLICT.value()); //Status you want
     error.setCode("CODE");
     error.setMessage(myException.getMessage());

     return new ResponseEntity<>(error, null, HttpStatus.CONFLICT);
  }

  @ExceptionHandler({DataAccessException.class, , OtherException.class})
   public ResponseEntity<?> handleResourceNotFoundException(Exception
exception, HttpServletRequest request) {

     Error error = new Error();
     error.setStatus(HttpStatus.INTERNAL_ERROR.value()); //Status you want
     error.setCode("CODE");
     error.setMessage(myException.getMessage());

     return new ResponseEntity<>(error, null, HttpStatus.INTERNAL_ERROR);
  }
}

其他方式:

直接注释例外

其他方式是直接使用状态和返回原因来注释:

@ResponseStatus(value=HttpStatus.CONFLICT, reason="Error with StreamingResponseBody") 
 public class MyError extends RuntimeException {
     // Impl ...
 }

特定控制器中的异常处理程序

@ExceptionHandler的方法中使用@Controller注释的方法来处理@RequestMapping例外:

@ResponseStatus(value=HttpStatus.CONFLICT,
                  reason="Error with StreamingResponse Body") 
  @ExceptionHandler(MyError.class)
  public void entitiyExists() {
  }

答案 1 :(得分:0)

我想出了问题。客户端仅接受文件类型作为可接受的响应。因此,当以html页面的形式返回错误时,我得到httpstatus 406.我只需要告诉客户端接受html以显示消息。