2017-01-22 152 views
0

我知道这已被问了很多次,但没有一个能够让我的代码工作。我可能做错了什么,但我找不到什么。春季截取不起作用

我正在使用AngularJS的Spring Boot,我试图做的是预处理所有的请求。

这是我的代码:

控制器:

@RestController 
@RequestMapping(value = { "/user" }) 
public class UserController { 

    @RequestMapping(value = "/get", method = RequestMethod.GET) 
    public String getLanguage() { 
     return "user"; 
    } 
} 

拦截:

@Component 
public class RequestHandler extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { 
     System.out.println("intercepted"); 
     return false; 
    } 
} 

WebConfig:

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Autowired 
    HandlerInterceptor requestHandler; 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(requestHandler); 
    } 
} 

而且我将此添加到applicationContext.xml中:

<mvc:interceptors> 
    <bean class="server.RequestHandler" /> 
</mvc:interceptors> 

我一直在周末试图做这项工作,我不能,任何帮助将非常感激!

谢谢!

+0

你试过注入RequestHandler而不是一般的HandlerInterceptor。或者用registry.addInterceptor(new RequestHandler())注册你的拦截器? – Nathanael

+0

我已经尝试过,但它仍然无法工作。 – Motomine

+0

为什么你有用于设置Spring MVC的xml和java配置......这是等待发生的麻烦......也没有'@ EnableWebMvc'或''那些配置不是如果你手动配置'HandlerAdapter'和/或'HandlerMapping',情况同样适用。 –

回答

0

你可以尝试手动定义Bean不声明Interceptor作为@Component这样的:

RequestHandler.java

public class RequestHandler extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws ServletException { 
     System.out.println("intercepted"); 
     return true; 
    } 
} 

WebConfig.java

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public RequestHandler requestHandler() { 
     return new RequestHandler(); 
    } 

    @Override 
    public void addInterceptors(final InterceptorRegistry registry) { 
     registry.addInterceptor(requestHandler()); 
    } 
} 

顺便说一句:如果该类声明为拦截器,为什么不重命名为包含术语的拦截器,如RequestInterceptor

它应该直接工作。请让我知道,如果这为你做了诡计!

更新:我已经实现了这个原型。看到这个最小的,完整的,可验证的例子。希望能帮助到你! https://github.com/dbubenheim/stackoverflow-41794738.git

+0

我试过,但说它可以在那里创建一个bean。我不知道我还能做什么,因为我尝试了很多东西。我可以在web.xml中设置一些东西吗?因为我是空的,所以我试图在那里设置servlet映射,但它说它可以被声明或类似的东西。 – Motomine

+0

我已更新我的答案并添加了一个最简单的示例。也许你有时间去验证它是否适合你。 –

+0

另外我不得不提到'preHandle'方法的返回值应该是'true',以便完成请求处理程序链并访问您的控制器方法。请看看这个以及@Motomine –