Java 弹簧靴1.4.3和@ControllerAdvice
我有一个带有ControllerAdvice扩展ResponseEntityExceptionHandler的Spring4应用程序,当异常出现时,它可以正常工作Java 弹簧靴1.4.3和@ControllerAdvice,java,spring-mvc,spring-boot-actuator,Java,Spring Mvc,Spring Boot Actuator,我有一个带有ControllerAdvice扩展ResponseEntityExceptionHandler的Spring4应用程序,当异常出现时,它可以正常工作 @ControllerAdvice @Slf4j public class ExceptionManager extends ResponseEntityExceptionHandler { @Override protected ResponseEntity<Object> handleMethodAr
@ControllerAdvice
@Slf4j
public class ExceptionManager extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
final ValidationErrors errors = getErrors(ex.getBindingResult());
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(ex, errors, headers, HttpStatus.BAD_REQUEST, request);
}
@Override
protected ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
final ValidationErrors errors = getErrors(ex.getBindingResult());
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(ex, errors, headers, HttpStatus.BAD_REQUEST, request);
}
@ExceptionHandler(ValidationException.class)
public ResponseEntity handleValidationException(ValidationException ex) {
log.warn("Validation error", ex);
return ex.toResponseEntity();
}
@ExceptionHandler(HttpClientErrorException.class)
public ResponseEntity handleHttpClientErrorException(HttpClientErrorException ex) {
log.error(ex.getMessage());
return new ResponseEntity(ex.getResponseBodyAsString(), ex.getStatusCode());
}
@ExceptionHandler({Exception.class, RuntimeException.class})
protected ResponseEntity<Object> handleRootException(Exception ex, WebRequest request) {
return handleException(request, ex);
}
...
}
例外情况未被捕获!
它发生在特定情况下,@RestController使用调用外部端点的服务时。在我的例子中,外部服务返回一个XML,如果它像上面的异常一样被破坏,那么SAXParseException将不会被捕获,并在spring之前自动转换为一个400错误请求和一个空正文。它也根本不被记录
如果在我的RestController中,我添加了一个方法@ExceptionHandlerThrowable.class,就会调用这个方法,我可以控制返回的错误
这正常吗?我认为ControllerAdvice可以集中所有异常处理,消除每个控制器中都需要ExceptionHandler的需要。刚刚找到了解决方案:删除extends ResponseEntityExceptionHandler。如果@ControllerAdvice不扩展任何内容,看起来效果会更好。内部handleRootExceptioninside方法pass Throwable而不是Exception ex@VinayPrajapati我已将其更新为@ExceptionHandlerThrowable.class@ResponseBody public ResponseEntity HandlerOotexception rowable ex,WebRequest req{log.errorException received:,ex;返回新的ResponseEntityex,HttpStatus.INTERNAL_SERVER_ERROR;}但是仍然没有调用,因此如果将此代码放在控制器中,则此代码可以正常工作。如果您没有打印整个异常堆栈跟踪,“原因”表示它是一个包装异常,而不是实际引发的顶级异常。@Gimby我在控制器中使用@ExceptionHandler时添加了完整的堆栈。仅供参考,XML响应为brok在标记的中间有一个行返回以引发异常。因此,实际可捕获的异常是HttpMessageNodeTableException;如果您没有专门处理它,则应调用通用handleRootException。这没有发生?实际上这不是一个正确的解决方案。它确实会捕获SAXParseException,但随后它不会s不再捕获其他一些,如MethodArgumentNotValidException,我想是因为ResponseEndityExceptionHandler.handleMethodArgumentNotValid不再被覆盖是的,当定义一个用@ExceptionHandlerMethodArgumentNotValidException.class注释的方法时,事件没有被捕获。好吧,还是比以前更好。。。
Exception received:
org.springframework.http.converter.HttpMessageNotReadableException: Could not unmarshal to [class com.company.etc.v1.PojoResponse]: null; nested exception is javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 28; Attribute name "entResponse" associated with an element type "assetDocum" must be followed by the ' = ' character.]
at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.readFromSource(Jaxb2RootElementHttpMessageConverter.java:149)
at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.readInternal(AbstractXmlHttpMessageConverter.java:61)
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:193)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:104)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:917)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:901)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
at com.company.service.impl.SearchAsset.searchAssets(SearchAsset.java:42)
... 57 common frames omitted
Caused by: javax.xml.bind.UnmarshalException: null
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:335)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:563)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:249)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:140)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:123)
at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.readFromSource(Jaxb2RootElementHttpMessageConverter.java:133)
... 127 common frames omitted
Caused by: org.xml.sax.SAXParseException: Attribute name "entResponse" associated with an element type "assetDocum" must be followed by the ' = ' character.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
... 131 common frames omitted