Java - 抛出异常仍然生成200状态代码

时间:2017-12-09 21:55:02

标签: java spring

我有一个方法,如果输入为空,则应抛出异常。输入(在本例中为列表)如果为空则将抛出异常。我已经使用JUnit对此进行了调试,并且可以确认传入[]会抛出异常。但是,在我的前端应用程序中,传入空列表仍然会将响应状态显示为200(如开发人员控制台中所示)。不应该抛出异常产生500的响应状态?至少那是我正在寻找的,所以这样我就可以向用户回复错误消息。如何获得以下信息以生成500的响应状态?我正在使用spring框架。

public Boolean validate(List<HashMap<String, Object>> myList) throws MyException{
 Boolean hasErrors = false;
     if(!myList.isEmpty()){
        //logic goes here
        ....
    } else{
       hasErrors = true;
       throw new MyException("myList shouldn't be empty ");
   }
   return hasErrors;
}

此处的异常类:

public class MyException extends Exception {
  public MyException() { super(); }
  public MyException(String message) { super(message); }
  public MyException(String message, Throwable cause) { super(message, cause); }
  public MyException(Throwable cause) { super(cause); }
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

我建议您使用proper exception handling using Spring MVC,这样,在抛出异常时应该将什么作为状态代码返回更清楚。

例如,您可以在异常类中执行以下操作:

@ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR, reason="myList shouldn't be empty")
public class MyException extends Exception {
  public MyException() { super(); }
  public MyException(String message) { super(message); }
  public MyException(String message, Throwable cause) { super(message, cause); }
  public MyException(Throwable cause) { super(cause); }
}

答案 1 :(得分:0)

您可以使用@ControllerAdvice来处理您抛出的异常,然后指定您希望客户返回的状态。

以下是我测试的示例,我测试用户上传的文件是否对网站来说太大而且返回错误请求(html代码400)。

toExceptionResponeString只是一个将我的异常转换为json字符串的方法,任何字符串都会为返回做。

您可以使用MyException课程代替MaxUploadSizeExceededException并从那里处理。

@ControllerAdvice
public class ExceptionController extends ResponseEntityExceptionHandler {

  @Autowired
  private ApplicationLogService appLogService;

  @ExceptionHandler(value = { MaxUploadSizeExceededException.class })
  protected ResponseEntity<Object> handleMaxUploadSizeExceededException(Exception ex, WebRequest request) {
    MaxUploadSizeExceededException musee = (MaxUploadSizeExceededException)ex;
    SizeLimitExceededException slee = musee.getCause() instanceof SizeLimitExceededException ? (SizeLimitExceededException) musee.getCause() : null;
    Long maxSize = slee == null ? musee.getMaxUploadSize() : slee.getPermittedSize();
    Long actualSize = slee == null ? Long.valueOf(request.getHeader("Content-Length")) : slee.getActualSize();

    PortalException pre = PortalException.fileSizeTooLarge(maxSize, actualSize);
    try {
      appLogService.addExceptionEntry(pre.getMessage());
    } catch (Exception e) { }
    return handleExceptionInternal(ex, toExceptionResponseString(pre), new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
  }
}