ExceptionHandler在控制器中不起作用

时间:2020-10-17 12:05:39

标签: java spring exception

我想用spring更改REST API请求的返回状态。

我创建了一个异常类:

public class AutomatedActionValidatorException extends RuntimeException {

    public AutomatedActionValidatorException(String message) {
        super(message);
    }
}

和一个控制器(注释了我用于测试异常引发的原始代码):

@Controller
@RequestMapping("/api/automated_actions")
public class AutomatedActionController {

    @Resource
    private AutomatedActionsService automatedActionsService;

    @Resource
    private AutomatedActionResponseService automatedActionResponseService;

    @Resource
    private AutomatedActionsSchedulingService automatedActionsSchedulingService;

    @ResponseBody
    @RequestMapping(value = "/save_and_run", method = RequestMethod.POST)
    public AutomatedAction saveAndRunAutomatedAction(HttpServletRequest request,
                                                     @RequestBody AutomatedActionRequest automatedActionRequest) {
        throw new AutomatedActionValidatorException("");

//        AutomatedAction automatedAction = saveAutomatedAction(request, automatedActionRequest);
//        automatedActionsSchedulingService.runAutomatedActions(Collections.singletonList(automatedAction));
//        return automatedAction;
    }

    private AutomatedAction saveAutomatedAction(HttpServletRequest request,
                                               @RequestBody AutomatedActionRequest automatedActionRequest) {
        return automatedActionsService.save(automatedActionRequest);
    }


    @ExceptionHandler(value = AutomatedActionValidatorException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    @ResponseBody
    public String handleAutomatedActionValidatorException(AutomatedActionValidatorException ex) {
        return ex.getMessage();
    }

调用该端点时,我仍然收到500错误代码。

从我添加的日志中,handleAutomatedActionValidatorException方法已被忽略。

我收到的回复是:

{
  errorMessage: "Unexpected error occurred.", data: null, success: false, 
  errorMessageKey: null}
  data: null
  errorMessage: "Unexpected error occurred."
  errorMessageKey: null
  success: false
}

知道我想念什么吗?

谢谢

1 个答案:

答案 0 :(得分:0)

((如果您的@RequestBody AutomatedActionRequest automatedActionRequest由客户端以错误的格式发送,我不确定是否会抛出状态代码500,您可能要注释掉该代码,直到它抛出您正在等待的异常

编辑:如果RequestBody格式错误,它将删除BAD_REQUEST。我的例外500必须在此时代码到达之前发生)

如果您没有在ExceptionHandler中做任何特别的事情,也许足以将您的异常更改为此:

@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "Bad request!")
public class AutomatedActionValidatorException extends RuntimeException {

    public AutomatedActionValidatorException(String message) {
        super(message);
    }
}

请检查其是否正常工作。 (在注释中阻止您的异常处理程序)

如果返回代码400,那么您将知道问题出在异常处理程序中。

这些可能会帮助您:

https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc https://www.baeldung.com/spring-response-status-exception