2017-02-27 3 views
1

Ich habe ein Servlet ausgeführt und versuche einen Eigenschaftswert in einen Filter zu injizieren.@Value injiziert keine Eigenschaft, bleibt null

Ich bin zuversichtlich, dass die AppConfig-Datei geladen wird (wenn ich den Dateinamen ändern, erhalte ich eine FileNotFound-Ausnahme). Gleiche Anzahl für die Eigenschaftendatei.

Es scheint die Klasse, in der ich versuche, die Eigenschaft zu injizieren, wird von Spring irgendwie ignoriert. Es ist ein Filter (siehe unten). Ich habe damit experimentiert, indem ich den Eigenschaftswert in die Annotation selbst eingefügt habe. (@Value ("$ {filter.weburl: 'einige'}"). Allerdings bleibt der String WebUrl NULL

Kann mir jemand helfen, herauszufinden, was hier vor sich geht

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() { 

    } 
} 

Meine.? AppConfig Datei:

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

Ihr Filter ist auch tatsächlich eine Feder Bohne? Grundsätzlich kann das Feld nicht 'null' sein, wenn es nicht aufgelöst werden kann, wird es auf den von Ihnen angegebenen Standard zurückgreifen. Aufgrund der Tatsache, dass dies nicht der Fall ist, bezweifle ich, dass die von Ihnen verwendete Instanz des Filters eine von Spring bekannte Instanz ist. –

+0

Haben Sie versucht, die Felder, die mit @Value gefüllt werden sollen, öffentlich zu setzen? –

Antwort

1

Sie müssen in Ihrer Konfigurationsklasse folgend haben

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

Filter konfigurieren web.xm verwenden. l tun, um diesen

<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

Ich hätte das zu meiner Frage hinzufügen sollen, aber es ist schon da :-). Ich habe meine Frage bearbeitet, um dies zu klären. –

+0

Wie registrierst du deinen Filter? kannst du diesen Code teilen? – mhshimul

+0

siehe meine Antwort hier http://stackoverflow.com/questions/42176625/spring-boot-1-5-1-inside-registered-filter-can-not-access-spring-context-valu – mhshimul

1

Wenn Sie einen Filter im Anwendungskontext registrieren wird es für alle Anfragen registriert werden, wenn Sie einen FilterRegistrationBean verwenden, können Sie die URL-Pfade anpassen, die die Filter gelten. Du scheinst beides zu haben und es verursacht wahrscheinlich alle möglichen Probleme. Auch Ihr Filter ist mit @Component ANNOTE UND Sie erstellen den Filter als Bean in Ihrer Konfigurationsklasse.

Dies ist, wie Sie Ihren Code strukturieren sollte, damit es funktioniert:

// 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 
} 

Konfigurationsklasse:

@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; 
    } 
} 
Verwandte Themen