[英]Spring Boot 1.4.3 and @ControllerAdvice
我有一个带有ControllerAdvice的Spring 4应用程序,该应用程序扩展了ResponseEntityExceptionHandler,当出现异常时可以正常工作。
@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);
}
...
}
但是,如果没有编组例外,例如
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
没有捕获到异常! 在特定情况下,当@RestController使用调用外部端点的服务时,就会发生这种情况。 在我的情况下,外部服务返回一个XML,并且如果它已损坏(如上述异常),那么SAXParseException
不会被捕获,并在春季之前自动转换为带有空主体的400 Bad Request。 它也根本不记录。
如果在我的RestController中添加一个方法@ExceptionHandler(Throwable.class)
, @ExceptionHandler(Throwable.class)
调用此@ExceptionHandler(Throwable.class)
,并且我可以控制发送回的错误。
这正常吗? 我以为ControllerAdvice可以集中所有异常处理,而无需在每个控制器中都具有ExceptionHandler。
刚找到解决方案:删除extends ResponseEntityExceptionHandler
。 如果您@ControllerAdvice
不扩展任何内容,则看起来效果更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.