Spring ApplicationListener引发RuntimeException并没有被@ControllerAdvice捕获

时间:2018-08-07 20:58:08

标签: spring-boot spring-rest

我们使用的Spring Boot 2.x刚刚从1.4范围更新。在ApplicationListener侦听自定义ApplicationEvent之前,我们将抛出RuntimeException,我们的React.js UI将返回JSON并返回字符串中的错误消息。我们在ExceptionHandler@ControllerAdvice中添加了一个ApplicationListener,以修复可能引发异常的常规请求/响应路径,以使UI可以将其接收为JSON并显示适当的UI错误对话框并显示漂亮的消息。很多时候,该消息只是我们放入引发的异常中的消息字符串。

但是,在我们的RuntimeException代码中,抛出了throw new RuntimeException("Your account is locked out. Please check your email for reset instructions."); ,并在其中添加了一个很好的消息String。 UI不会收到此响应/ JSON,而是一个简单的HttpStatus(500)和常规的“内部服务器错误”字符串。绝对不是我们放入异常的好字符串。

这在Spring Boot 1.x上有效,但在Spring Boot 2.0上不再可用

这是侦听器中的引发代码。

Exception

以下是通用RuntimeException的代码。我还尝试了用相同的方法,用RuntimeException注释不同的名称,但是那也不起作用。下面的代码还显示了将状态设置为INTERNAL_SERVER_ERROR。但是我将其更改为其他内容,并且在侦听器中抛出的@ExceptionHandler(Exception.class) ResponseEntity<Object> handleGeneralExceptions(Exception ex, HttpServletResponse response) throws IOException { LOGGER.error("",ex); return getErrorResponse(ex, null, HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage(), response ); } 仍然是500状态,并且在此方法中设置断点表明,侦听器中引发的异常从未调用过它。 / p>

    function getCity(val) {
$.ajax({
type: "POST",
url: "getCity.php",
data:'state_id='+val,
success: function(data){

    let dropdown = $('#city-list');
    dropdown.empty();

    var cities = data;
    $.each(cities, function (key,entry) {
    dropdown.append($('<option></option>').attr('value', entry.id).text(entry.lga_name));
    dropdown.trigger('change', true);
    });


}
});
}

1 个答案:

答案 0 :(得分:0)

我的一个队友解决了这个问题。

首先,它仅是侦听器,并且仅是与Spring Security AuthenticationEvent

相关的侦听器

我们添加了一个新的Exception类和一个Serializer

我们还有一个

static class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

并在添加的config()方法中

 .exceptionTranslator(exception -> {
     if (exception instanceof OAuth2Exception) {
         OAuth2Exception oAuth2Exception = (OAuth2Exception) exception;
         return ResponseEntity.status(oAuth2Exception.getHttpErrorCode())
                              .body(new CustomOauthException(oAuth2Exception.getMessage()));
     } else {
         throw exception;
     }
 })