spring在过滤器中使用@Value批注


问题内容

我目前正在处理Spring项目,并且正在制作一个新的过滤器,用于检查请求中是否发送了有效的JWT。

我遇到了这样的问题:无法使用@Value注释从application.yml文件中获取值。

@Component
@Order(2)
public class JwtConfiguration implements Filter {

    @Value("${jwt.secret}")
    private String jwtSecret;

我知道这很好用,因为我在单元测试中有同样的事情。

我在某处读到该过滤器不在应用程序上下文中,因此它将无法访问配置,并且无法自动装配依赖关系。

有谁知道从我的application.yml中获取值到过滤器的好技术?

我也没有使用任何XML配置,并且希望使用不使用它们的解决方案。

我正在使用Spring Boot版本1.3.3。


问题答案:

这可以通过实现ServletContextInitializer来实现。请参见下面的示例代码。

@Configuration
public class WebConfigurer implements ServletContextInitializer {

    @Value("${jwt.secret}")
    private String jwtSecret;

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        EnumSet<DispatcherType> disps = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC);
        initFilter(servletContext, disps);
    }


    private void initFilter(ServletContext servletContext,
                                              EnumSet<DispatcherType> disps) {
        FilterRegistration.Dynamic myFilter =
            servletContext.addFilter("myFilter",
                new MyFilterClass(jwtSecret));

        // You can pass null as first parameter to below API calls
        myFilter.addMappingForUrlPatterns(disps, true, "/content/*");
        myFilter.addMappingForUrlPatterns(disps, true, "/app/*");
        myFilter.setAsyncSupported(true);
    }

}

编辑/更新:

我想还有另一种使用Java Config添加过滤器的方法

您可以使用FilterRegistrationBean注册过滤器。在这里,您可以使用setOrder方法设置订单。但是认为它会创建与过滤器一样多的ServletContextInitializer,因为FilterRegistrationBean是ServletContextInitializer,