拦截器未初始化并使用SpringBoot调用

时间:2016-10-25 19:43:16

标签: spring spring-boot interceptor

我有一个Spring-Boot应用程序打包为与提供的tomcat依赖关系的战争(所以我有两个选项 - 使用打包的.war在嵌入式容器中运行后通过java -jar命令启动它也是在独立的servlet容器上运行。)

以下是我的App主要课程

package com.mycompany.edsa.dgv.proxysvc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import  org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.mycompany.edsa.dgv.proxysvc.interceptor.DGVProxySvcRequestInterceptor;

//import com.mycompany.edsa.dgv.proxysvc.config.ConfigExtension;

@SpringBootApplication
@ImportResource("classpath:dgv-proxy-svc-spring-ctx.xml")
//@Import(ConfigExtension.class)
public class DGVProxySvcAppMain extends SpringBootServletInitializer {

public static void main(String[] args) {
    SpringApplication.run(DGVProxySvcAppMain.class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(DGVProxySvcAppMain.class);
}

@Bean
public DGVProxySvcRequestInterceptor dgvProxySvcRequestInterceptor() {
    DGVProxySvcRequestInterceptor dgvProxySvcReqInterceptor = new DGVProxySvcRequestInterceptor();
    return dgvProxySvcReqInterceptor;
}


@Bean
public WebMvcConfigurerAdapter adapter() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            System.out.println("Adding interceptors");
            registry.addInterceptor(dgvProxySvcRequestInterceptor()).addPathPatterns("/*");
            super.addInterceptors(registry);
        }
    };
}

}

我的拦截器课程如下:

package com.mycompany.edsa.dgv.proxysvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Component
public class DGVProxySvcRequestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        /* Put in the code here to validate user principal before passing control to the controller */

        //BXPPrincipal principal = (BXPPrincipal)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        //Map<String, ?> result = principal.getAttributes();
        System.out.println("Inside DGVProxySvcRequestInterceptor...");
        return super.preHandle(request, response, handler);
    }

}

但是,在启动应用程序时(我通过spring-boot:run maven目标启动并使用Eclipse IDE),我没有看到我的拦截器在控制台日志中注册。 我尝试在调试模式下使用public void addInterceptors(InterceptorRegistry registry)方法的断点启动它,我看到此时控件出现,sysout消息"Adding interceptors"在控制台上记录,registry包含我的DGVProxySvcRequestInterceptor在其封装的ArrayList中但不确定为什么控制台上没有消息提到有关此拦截器bean初始化的任何信息。 此外,在调用我的服务时,我没有看到已经放入我的拦截器类'"Inside DGVProxySvcRequestInterceptor..."方法的sysout消息preHandle(它确认没有调用拦截器)。

有人可以帮助我找出我可能正在做的配置错误吗?

请注意 - 我尝试使用WebMvcConfigurerAdapter而不是SpringBootServletInitializer扩展我的主课程,并覆盖addInterceptors方法以添加我的拦截器。在这种情况下,我的拦截器初始化得很好(我可以在控制台日志中看到),并且在我调用我的服务uri时也会被调用。 所以这告诉我,当我尝试使用SpringBootServletInitializer时,我的配置有些不正确(我需要使用这个初始化程序,因为我需要将我的代码打包为可以在独立的servlet容器上运行的战争)。

提前感谢任何建议/指示!

4 个答案:

答案 0 :(得分:2)

找到修复程序。必须使用ant类似网址模式来匹配请求:

registry.addInterceptor(dgvProxySvcRequestInterceptor()).addPathPatterns("/**");

我的原始配置一切都很好;除上述网址模式外,不需要任何更改。

答案 1 :(得分:1)

我有同样的问题。 @SpringBootApplication仅扫描当前包中的所有组件。为了扫描其他包,我们需要在@ComponentScan中指定包。 例如

package com.main;
@SpringBootApplication
public class Application {
     //Code goes here.
}

现在我希望拦截器能够注册,它不在com.main而不是com.main.**,在com.test包中可用。

package com.test.interceptor
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
    @Autowired
    HeaderInterceptor headerInterceptor;

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

在上述情况下,Spring Boot不会在上下文中注册HeaderInterceptor。为了注册,我们必须明确扫描该包。

package com.main;
@SpringBootApplication
@ComponentScan("com.*") //Which takes care all the package which starts with com.
@ComponentScan({"com.main.*","com.test.*"}) //For specific packages
public class Application {
     //Code goes here.
}

答案 2 :(得分:0)

@Configuration
@EnableWebMvc 
public class AppConfig extends WebMvcConfigurerAdapter  {  
    // @Bean resolvers , etc

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new DGVProxySvcRequestInterceptor()).addPathPatterns("/controller/action/*");
    }
} 

答案 3 :(得分:0)

如果您使用的是Java 8,建议的实现是WebMvcConfigurationSupport。不推荐使用WebMvcConfigurerAdapter。