gpt4 book ai didi

spring - 拦截器未通过Spring Boot初始化和调用

转载 作者:行者123 更新时间:2023-12-03 13:58:17 28 4
gpt4 key购买 nike

我有一个Spring-Boot应用程序,它作为具有warmcat依赖项的war打包提供(因此,我有两个选择-使用打包的.war在通过java -jar命令启动它之后在嵌入式容器中运行,并且还可以在一个独立的servlet容器)。

以下是我的App主类(class)

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)方法的一个带有断点的 Debug模式下启动它,我看到此刻控制权出现,并且sysout消息 "Adding interceptors"记录在控制台上,而且 registry在封装的ArrayList中包含我的 DGVProxySvcRequestInterceptor,但不确定为什么没有控制台上的消息,其中提到有关此拦截器bean初始化的任何内容。
而且,在调用我的服务时,我看不到已在我的拦截器类的 "Inside DGVProxySvcRequestInterceptor..."方法中放入sysout消息 preHandle(这证实了拦截器没有被调用)。

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

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

在此先感谢您的任何建议/指针!

最佳答案

找到了解决方法。必须使用ant这样的url模式来匹配请求:

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

我原来的配置很好。除了上述网址格式外,不需要任何更改。

关于spring - 拦截器未通过Spring Boot初始化和调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40248406/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com