控制器建议无法捕捉异常

问题描述:

我对Spring MVC比较陌生,目前我需要为Web服务包含一个身份验证拦截器。如果身份验证失败,我需要拦截器来引发AccessForbiddenException,如果通过则返回true。我还创建了一个AuthenticationExceptionController来捕获异常并返回一个带有HttpStatus的ResponseEntity。但是,当我遇到内部错误500,我怀疑这是由于AuthenticationExceptionController无法捕获异常。以下是我的代码。有关我如何解决它的任何建议?控制器建议无法捕捉异常

AuthenticationInterceptor.java

package path.controller; 

public class AuthenticationInterceptor implements HandlerInterceptor { 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 
     // handle the authentication check 

     if(authentication fails) { 
      throw new AccessForbiddenException("access forbidden"); 
     } 
     return true; 
    } 

    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
     throws Exception { 
    } 
} 

AccessForbiddenException.java

package path.controller; 

public class AccessForbiddenException extends RunTimeException{ 
    public AccessForbiddenException(String message) { 
     super(message); 
    } 
} 

AuthenticationExceptionController.java

package path.controller; 

@ControllerAdvice 
public class AuthenticationExceptionController {  

    @ExceptionHandler(AccessForbiddenException.class) 
    public ResponseEntity<?> handleException(AccessForbiddenException e) { 
     return new ResponseEntity<String>(e.getMessage(), HttpStatus.FORBIDDEN); 
    } 
} 

根的context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context.xsd 
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <context:annotation-config /> 
    <bean id="contextApplicationContextProvider" class="path.context.provider.ApplicationContextProvider"></bean> 

    <context:property-placeholder location="classpath:application.properties" /> 

    <context:component-scan base-package="path.**" /> 
</beans> 

servlet的context.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <context:property-placeholder location="classpath:application.properties" /> 

    <context:annotation-config /> 

    <annotation-driven /> 

    <view-controller path="" view-name="index.html" /> 

    <resources mapping="**" location="/" /> 

    <beans:bean 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/" /> 
     <beans:property name="suffix" value="" /> 
    </beans:bean> 

    <interceptors> 
     <interceptor> 
      <mapping path="/**" /> 
      <exclude-mapping path="/login"/> 
      <exclude-mapping path="/authenticate"/> 
      <beans:bean class="path.controller.AuthenticationInterceptor" /> 
     </interceptor> 
    </interceptors> 

    <context:component-scan base-package="path" use-default-filters="false"> 
     <context:include-filter expression="path.Controller" type="annotation" /> 
    </context:component-scan> 
</beans:beans> 
+2

1.如果你是新手,不要从Spring XML开始;世界已经移动。 2.发布500错误。 3.发布堆栈跟踪,其中有一个。 4.发布请求。 –

@ControllerAdvice捕捉仅在控制器级别产生的异常。

所以如果在控制器调用之前在auth级别抛出异常,这是徒劳的。

相反,您可以尝试在auth之前添加过滤器并捕获过滤器中的异常。