简体   繁体   English

Spring @ExceptionHandler(Exception.class)总是被调用。 为什么?

[英]Spring @ExceptionHandler(Exception.class) always gets called. Why?

I have a code structure where there is base controller class providing the basic require methods followed by specific controller classes inheriting from this base class. 我有一个代码结构,其中有基础控制器类提供基本的require方法,然后是从该基础类继承的特定控制器类。 Now whenever I make a REST service call to one of the services mentioned in the sub classes, the base class method annotated with @ExceptionHandler gets called followed by the actual request mapped method. 现在,每当我对子类中提到的服务之一进行REST服务调用时,都会调用带有@ExceptionHandler注释的基类方法,然后调用实际的请求映射方法。 This is not causing problem as I get the required response. 当我得到所需的响应时,这不会引起问题。 But I am concerned with the performance issues it may pose and want to eliminate the unnecessary control flow to the method. 但是我担心它可能带来的性能问题,并希望消除对该方法不必要的控制流。 Any suggestions/solutions? 有什么建议/解决方案吗? Here is my code - 这是我的代码-

    public class BaseApiController extends AbstractController {
        protected @Autowired HttpServletRequest request;



        protected ServerResponse serverResponse() {
            ServerResponse serverResponse = new ServerResponse();
            return serverResponse;
        }


        @ExceptionHandler(Exception.class)
        public @ModelAttribute("response") ServerResponse exceptionHandler(Exception ex) {
            ServerResponse response = new ServerResponse();
            response.setError(new Error("500", ex.getMessage(), ex.getStackTrace(), ex));

            Log.error(this.getClass(),
                    "[" + this.getClass().getSimpleName() + ": baseApiExceptionHandler] Response: " + response.toString());
            return response;
        }
    }


@Controller
@RequestMapping("/test")    
public class TestController extends BaseApiController {

    @Autowired
    private UserService userService;


    @RequestMapping(value = "/ping", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    public @ModelAttribute("response") ServerResponse ping() {
        Log.debug(this.getClass(), "testing ping...");
        ServerResponse serverResponse = this.serverResponse();
        serverResponse.setResult("SmartLBS says hi");

        Log.debug(this.getClass(), "responding: " + serverResponse.toString());
        return serverResponse;
    }
}

It gets invoked with the following stack trace. 它通过以下堆栈跟踪调用。

ERROR UserController:73 - [UserController: baseApiExceptionHandler] Response: ServerResponse{result=null, error=Error{code='500', message=null, stackTrace=[sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method), sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39), sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27), java.lang.reflect.Constructor.newInstance(Constructor.java:513), org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147), org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104), org.springframework.web.method.annotation.support.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:137), org.springframework.web.servlet.mvc.method.annotation.support.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:83), org.springframework.web.method.annotation.support.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:101), org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74), org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155), org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117), org.springframework.web.method.annotation.ModelFactory.invokeModelAttributeMethods(ModelFactory.java:118), org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:100), org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:626), org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:590), org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80), org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900), com.locationguru.framework.base.BaseDispatcherServlet.doDispatch(BaseDispatcherServlet.java:31), org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827), com.locationguru.framework.base.BaseDispatcherServlet.doService(BaseDispatcherServlet.java:24), org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:874), org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:779), javax.servlet.http.HttpServlet.service(HttpServlet.java:621), com.locationguru.framework.base.BaseDispatcherServlet.service(BaseDispatcherServlet.java:38), javax.servlet.http.HttpServlet.service(HttpServlet.java:722), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210), org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210), com.locationguru.smartlbs.middleware.auth.AppAuthFilter.doFilterInternal(AppAuthFilter.java:84), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76), org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346), org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210), com.locationguru.smartlbs.middleware.auth.UserAuthFilter.doFilterInternal(UserAuthFilter.java:88), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76), org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346), org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210), org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224), org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185), org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472), org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151), org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100), org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929), org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118), org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405), org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269), org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515), org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302), java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908), java.lang.Thread.run(Thread.java:680)], exception=java.lang.Exception}, reqTime=1321362850208, respTime=null}
public @ModelAttribute("response") ServerResponse exceptionHandler

The @ModelAttribute declaration in the above code was causing the issues. 上面代码中的@ModelAttribute声明引起了问题。 Replaced it with @ResponseBody and the problem was fixed. 用@ResponseBody替换它,此问题已解决。

Are you sure that the method 你确定方法

@ExceptionHandler
public @ModelAttribute("response") ServerResponse exceptionHandler(Exception ex) {
   ..
   response.setError(new Error("500", ex.getMessage(), ex.getStackTrace(), ex));

Is invoked with no exception?! 毫无例外地被调用?! Even if it is invoked with ex=null then this should cause a null pointer exception! 即使使用ex=null调用它,也应该导致空指针异常!

Really, I belive there is some mistake in your observation. 真的,我相信您的观察中有一些错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何确保 @ExceptionHandler(Exception.class) 在 Spring Boot 中最后被调用? - How to make sure that @ExceptionHandler(Exception.class) will be called last in Spring Boot? 为什么 @ExceptionHandler(MethodArgumentNotValidException.class) 被忽略而支持 @ExceptionHandler(Exception.class) - Why @ExceptionHandler(MethodArgumentNotValidException.class) is ignored in favour of @ExceptionHandler(Exception.class) @ExceptionHandler(Exception.class)不处理所有类型的异常 - @ExceptionHandler(Exception.class) not handling all types of exceptions 使用 @ControllerAdvice 注释 @ExceptionHandler(Exception.class) 工作但 @ExceptionHandler({AuthenticationException.class) 不工作 - Using @ControllerAdvice annotation @ExceptionHandler(Exception.class) is working but @ExceptionHandler({AuthenticationException.class) is not working 仅当没有Exception的映射时,才会调用@ExceptionHandler for Error - @ExceptionHandler for Error gets called only if there's no mapping for Exception 自定义 ResponseEntityExceptionHandler 中的 Spring 异常未调用类型 Exception 的 @ExceptionHandler - @ExceptionHandler for type Exception not called for Spring exception in custom ResponseEntityExceptionHandler 期望Exception.class的TestNG类 - TestNG classes expecting Exception.class 在Spring @Transactional内部启用JPA保存且多个实体不会回滚,并启用了Exception.class的回滚 - JPA save with multiple entities not rolling back when inside Spring @Transactional and rollback for Exception.class enabled 使用JUnit @Test(expected = Exception.Class)捕获异常 - Catching Exception with JUnit @Test(expected=Exception.Class) Mockito:thenThrow(Exception.class)和thenThrow(new Exception())之间的区别 - Mockito: difference between thenThrow(Exception.class) and thenThrow(new Exception())
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM