我已经实现了一个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());
}
答案 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以显示消息。