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

标签 java spring spring-mvc

我有一个代码结构,其中有基 Controller 类提供基本的 require 方法,后面跟着从该基类继承的特定 Controller 类。现在,每当我对子类中提到的服务之一进行 REST 服务调用时,都会调用使用 @ExceptionHandler 注释的基类方法,然后调用实际的请求映射方法。当我得到所需的响应时,这不会引起问题。但我担心它可能带来的性能问题,并希望消除该方法不必要的控制流。有什么建议/解决方案吗?这是我的代码 -

    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;
    }
}

它通过以下堆栈跟踪进行调用。

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

上述代码中的 @ModelAttribute 声明导致了问题。将其替换为@ResponseBody,问题得到解决。

关于java - Spring @ExceptionHandler(Exception.class) 总是被调用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8137047/

相关文章:

java - 调用方法有问题

java - JFrame 不工作 - 内容不出现

java - Spring Security 登录和注销

java - Spring Mvc Java 无法在名称为 'home' 的 servlet 中解析名称为 'dispatcher' 的 View

java - 如何使用 Class.forName 的结果创建泛型类的实例

java - 我的应用程序总是崩溃,并且似乎找不到任何错误

java - Spring WebFlux文件上传: Unsupported Media Type 415 with Multipart upload

java - Ajax、Java 和 Hibernate

java - 将跟踪模式设置为 cookie 以删除附加的 session ID,而不使用 web.xml

java - 使用 <c :import> with spring views 的可能性