Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧靴1.4.3和@ControllerAdvice_Java_Spring Mvc_Spring Boot Actuator - Fatal编程技术网

Java 弹簧靴1.4.3和@ControllerAdvice

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扩展ResponseEntityExceptionHandler的Spring4应用程序,当异常出现时,它可以正常工作

@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