2017-02-27 75 views
1

我有一个servlet正在运行,我正在尝试将一个属性值注入到Filter中。@Value不注入属性,保持为null

我相信appConfig文件正在被加载(当我改变文件名时,我得到一个FileNotFound异常)。属性文件的计数相同。

似乎我尝试注入属性的类在某种程度上被Spring忽略了。这是一个过滤器(见下文)。我已经通过在注释本身中添加属性值来进行试验。 (@Value( “$ {filter.weburl: '一些'}”。)但是,字符串WEBURL保持为空

谁能帮助我弄清楚是怎么回事

package example.servlet.filters; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 

import javax.servlet.*; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 


@Component 
public class AuthenticationFilter implements Filter{ 

    private ServletContext context; 
    private final Logger LOGGER = LoggerFactory.getLogger(AuthenticationFilter.class); 
    @Value("${filter.weburl:'some'}") 
    private String webURL; 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     this.context = filterConfig.getServletContext(); 
     this.context.log("AuthenticationFilter initialized"); 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     Cookie[] cookies = request.getCookies(); 
     if(cookies != null) { 
      for (Cookie cookie : cookies) { 
       System.out.println(cookie.getName() + " " + cookie.getValue() + "\n"); 
      } 
     } else { 
      ((HttpServletResponse)servletResponse).sendRedirect(webURL + "/inloggen"); 
     } 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

我? AppConfig的文件:

package example; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 

@Configuration 
@ComponentScan("example") 
@PropertySource("WEB-INF/service.properties") 
public class AppConfig { 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public FilterRegistrationBean authenticationFilterRegistrationBean() { 
     FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); 
     filterRegistrationBean.setFilter(getAuthenticationFilter()); 
     filterRegistrationBean.addUrlPatterns("/*"); 
     filterRegistrationBean.setName("authenticationFilter"); 
     filterRegistrationBean.setOrder(1); 
     return null; 
    } 

    @Bean(name="authenticationFilter") 
    public AuthenticationFilter getAuthenticationFilter() { 
     return new AuthenticationFilter(); 
    } 
} 
+0

你的过滤器其实也是一个Spring bean?基本上,如果该字段无法解析,则该字段不能为空,它将回退到您提供的默认值。由于事实并非如此,我怀疑你使用的过滤器的实例是Spring所知的一个实例。 –

+0

您是否尝试过设置应该由@Value填充到公共的字段? –

回答

1

您必须配置类以下

@Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

要使用web.xm配置过滤器。 l如果您在注册将被注册的所有请求,如果使用FilterRegistrationBean,你可以自定义过滤器适用于URL路径的应用程序上下文的过滤器做到这一点

<filter> 
    <filter-name>authenticationFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>authenticationFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

我应该添加这个到我的问题,但它已经在那里:-)。我编辑了我的问题来澄清这一点。 –

+0

你怎么注册你的过滤器?你可以分享该代码吗? – mhshimul

+0

看到我的答案在这里http://stackoverflow.com/questions/42176625/spring-boot-1-5-1-inside-registered-filter-can-not-access-spring-context-valu – mhshimul

1

。你似乎有两个,它可能会导致各种问题。此外,您的过滤器使用@Component进行注释,并且您正在创建过滤器作为配置类中的bean。

这是你如何组织你的代码,使其工作:

// No @Component annotation keeps this class pure as you're using your configuration class to create beans 
public class AuthenticationFilter implements Filter{ 

    private ServletContext context; 
    private final Logger LOGGER = LoggerFactory.getLogger(AuthenticationFilter.class); 
    private String webURL; 

    public AuthenticationFilter(String webURL) { 
     this.webURL = webURL; 
    } 

    // rest of filter 
} 

配置类:

@Configuration 
@ComponentScan("example") //if you have other components to scan, otherwise not required 
@PropertySource("WEB-INF/service.properties") 
public class AppConfig { 

    @Value("${filter.weburl:some}") 
    String webURL; 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public FilterRegistrationBean authenticationFilterRegistrationBean() { 
     FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); 
     filterRegistrationBean.setFilter(new AuthenticationFilter(this.webURL)); 
     filterRegistrationBean.addUrlPatterns("/*"); 
     filterRegistrationBean.setName("authenticationFilter"); 
     filterRegistrationBean.setOrder(1); 
     return filterRegistrationBean; 
    } 
}