我们使用的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);
});
}
});
}
答案 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;
}
})