19 Stimmen

Einige Bohnen in der Klasse Filter bean verwenden?

In meiner Filter-Bean-Klasse habe ich einige Beans-Abhängigkeit (mit @Autowired Bemerkung). Aber in der Methode doFilter() alle meine abhängigen Beans haben null ...

public class FacebookOAuth implements Filter
{
@Autowired
private BusinessLogger logger;

@Autowired
private IUserSessionInfo userSessionInfo;

@Autowired
private FacebookOAuthHelper oAuthHelper;

public void init(FilterConfig fc) throws ServletException
{
    // Nothing to do
}

public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws   IOException, ServletException
{
    // HttpServletRequest req = (HttpServletRequest)sr;
    HttpServletResponse res = (HttpServletResponse) sr1;

    String code = sr.getParameter("code");

    if (StringUtil.isNotBlankStr(code))
    {
        String authURL = this.oAuthHelper.getAuthURL(code);

this.oAuthHelper ist gleich null (und andere Abhängigkeit Bohnen zu) ...

Können Sie mir helfen?


Tatsächlich verwende ich keine MVC-Konzeption auf der Serverseite (Spring). Für meine Seite Client verwende ich Flex-Technologie und BlazeDS Servlet ton mit meinem Server kommunizieren.

Das ist der Grund, warum ich den Begriff Filterbohne verwende.

Also, wie kann ich meine Session Bean Begriff in meinem Filter Bean behandeln?


Skaffman,

Ich habe Ihre Idee umgesetzt, also aktualisiere ich meine application.xml mit :

<bean id="FacebookOAuthHandler" class="com.xx.FacebookOAuthHandler" />
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
    <props>
       <prop key="/fbauth">FacebookOAuthHandler</prop>         
    </props>
   </property>
</bean>

und mein FacebookOAuthHandler Klasse :

public class FacebookOAuthHandler extends AbstractController
{
@Autowired
private BusinessLogger logger;

@Autowired
private IUserSessionInfo userSessionInfo;

@Autowired
private FacebookOAuthHelper oAuthHelper;

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

    // TODO

    return null;
}

Aber, diese Methode handleRequestInternal wird nie aufgerufen, wenn meine URL : http://xx.xx.xx.xx/MyApp/fbauth

0 Stimmen

Wie sieht Ihre Federkonfiguration aus?

34voto

Mathias G. Punkte 4576

Ich stand vor dem gleichen Problem und meine erste Idee war, Spring manuell zu zwingen, die @Autowired-Anmerkung auf den Filter anzuwenden, wie hier vorgeschlagen

http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

Aber mir gefällt der Gedanke nicht, den Bean-Namen in meiner Java-Klasse fest zu kodieren.

Ich habe eine sauberere Methode gefunden, die auch funktioniert:

public void init(FilterConfig filterConfig) throws ServletException {
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
            filterConfig.getServletContext());
}

0 Stimmen

Die Referenz ist tot. Das gesamte Forum wurde im Jahr 2019 geschlossen. Haben Sie einen aktiven Verweis. bitte?

13voto

skaffman Punkte 389758

Angenommen, dies Filter ist in Ihrem Haus verkabelt web.xml dann wird dies nicht funktionieren, da es nicht von Spring, sondern vom Servlet-Container verwaltet wird. Also Dinge wie Autowiring wird nicht funktionieren.

Wenn Sie einen Servlet-Filter als Spring-Bean definieren möchten, müssen Sie ihn im Root-Anwendungskontext der Webapp definieren (unter Verwendung einer ContextLoaderListener in web.xml), und dann Definition einer DelegatingFilterProxy die an Ihre von Spring verwaltete Bean delegiert, um die Arbeit zu erledigen.

Aber braucht man dafür wirklich einen Servlet-Filter? Nach dem, was ich über die Facebook-Authentifizierung weiß, könnte dies so aussehen ebenso einfach mit einer Feder HandlerInterceptor . Dies würde erheblich weniger Konfigurationsaufwand bedeuten als ein delegierender Filter.

0 Stimmen

Hallo Skaffman! Vielen Dank für deine Antwort. Ja, alle meine Konfigurationsdateien (web.xml und meine application.xml) sind in Ordnung (mit ContextLoaderListenner, mit delegatingFilterProxy, usw.). Aber, auch mit dieser Konfiguration, ich kann nicht Bean in meinem Filter verwendet, das ist richtig?

0 Stimmen

Können Sie bitte einige Code-Beispiele geben, wie ein Servlet-Filter als eine Spring Bean zu definieren?

0 Stimmen

Ich sah tatsächlich pro-programmers.blogspot.co.il/2011/08/ Artikel, aber ich verwende nicht SpringMCV. Wird es helfen?

7voto

Dewfy Punkte 22558

Sehen Sie sich diese Antwort auf der Seite des Frühlings an: http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

Kurz gesagt - Sie können Spring manuell zwingen, die @Autowire-Anmerkung auf Ihren Filter anzuwenden:

public void init(FilterConfig filterConfig) throws ServletException {

    ServletContext servletContext = filterConfig.getServletContext();
    WebApplicationContext webApplicationContext = 
            WebApplicationContextUtils.getWebApplicationContext(servletContext);

    AutowireCapableBeanFactory autowireCapableBeanFactory =
           webApplicationContext.getAutowireCapableBeanFactory();

    autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}

7voto

Serge Ballesta Punkte 135062

Ich weiß, es ist eine alte Frage, aber es gibt kein Beispiel für die Verwendung von DelegatingFilterProxy in den aktuellen Antworten, und eine kürzlich gestellte Frage, in der nach einem solchen Beispiel gefragt wurde, wurde als Duplikat für diese Frage markiert.

Also ein DelegatingFilterProxy ist ein spezieller Filter, der sich mit Root ApplicationContext und delegiert seine doFilter zu einer Bohne.

Beispiel: MyFilter ist eine Klasse, die Filter und myFilter ist eine Frühlingsbohne

<bean id=myFilter class="org.example.MyFilter ...>...</bean>

oder in einer Konfigurationsklasse

@Bean
public MyFilter myFilter() {
    MyFilter myFilter = new MyFilter();
    //initialization ...
    return myFilter;
}

In web.xml deklarieren Sie einfach eine DelegatingFilterProxy mit dem gleichen Namen wie die Bohne :

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Auf diese Weise, als myBean eine echte Bohne ist, kann sie normal mit anderen Bohnen gespritzt werden mit @Autowired Anmerkungen, und seine doFilter Methode wird von der DelegatingFilterProxy . Da Sie die Methoden spring init und destroy verwenden können, ist standardmäßig initdestroy Methoden werden nicht aufgerufen, es sei denn, Sie geben den init-Parameter des Filters "targetFilterLifecycle" als "true" an.

0 Stimmen

Ich versuche, dies in meinem Projekt zu tun, aber beim Serverstart wird ein Fehler ausgegeben: Schwerwiegend: Exception starting filter myFilter org.springframework.beans.factory.NoSuchBeanDefinitionException: Es ist keine Bean mit dem Namen 'myFilter' definiert. Ich habe versucht, entweder über XML und Annotation zu konfigurieren. Es scheint, dass web.xml gelesen wird, bevor die Bohne konfiguriert wird.

0 Stimmen

Ich habe es in vielen Projekten verwendet und hatte nie Probleme. Aber die Bean muss im Root-Kontext deklariert werden, nicht im Dispatcher-Servlet-Kontext. Sie sollten zeigen, wie Sie Ihre Bean deklarieren.

0 Stimmen

Es tut mir leid für meine Unerfahrenheit, aber wie kann ich eine Bean entweder im Root- oder Dispatcher-Servlet-Kontext deklarieren? Ich habe gerade eine Konfigurationsklasse erstellt, in die ich eine "@Configuration"-Annotation eingefügt habe, und dann eine "@Bean" (mit Bezug auf die myFilter-Klasse) erstellt.

1voto

abhishek ringsia Punkte 1860

Ich war immer Null-Zeiger beim Zugriff auf Serviceklasse Bean in Filterklasse mit Autowiring. Ich suchte mehr als 100 Links, aber nicht in der Lage, eine Lösung zu finden. Ich verwende Spring Boot Application und Konfiguration, die erforderlich ist, um Bean in Filterklasse zu erhalten:

FilterConfig.java, die den Anwendungskontext Objekt.

@Component
public class FilterConfig  implements ApplicationContextAware{

private static ApplicationContext context;

public static ApplicationContext getApplicationContext() {
       return context;
    }
public  static <T> T getBean(String name,Class<T> aClass){
    return context.getBean(name,aClass);
}

@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    context = ctx;
}   

 }

in der Klasse Filter habe ich das so verwendet:

 UserService userService =FilterConfig.getBean("UserService", UserService.class);

UserService dies ist der Name der Bean, die in

  @Service("UserService")
  public class UserServiceImpl implements UserService { ...}

Keine Konfiguration in der Hauptklasse von Spring Boot :SpringBootServletInitializer

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X