2010-09-05 12 views
13

W mojej klasie komponentów filtrów dodano zależność od ziaren (z adnotacją @Autowired). Ale w metodzie doFilter(), wszyscy moi zależnościami fasola mieć wartość null ...Używanie niektórych ziaren w klasie bean bean Filter?

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 jest równy w wartości null (i innych ziaren dependancy TO) ...

mógłbyś mi pomóc?


W rzeczywistości nie używam pojęcia MVC po stronie serwera (wiosna). Dla mojego klienta korzystam z technologii Flex, a serwlet BlazeDS tonuje z moim serwerem.

Jest to powód, dla którego używam pojęcia bean filtrowej.

W jaki sposób mogę obsłużyć moje pojęcie komponentu bean sesji w moim komponencie bean filtru?


Skaffman,

I wdrożone swój pomysł, więc mogę zaktualizować application.xml z:

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

i mojego FacebookOAuthHandler Klasa:

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

ale ta metoda: handleRequestInt Ernal nigdy nie jest wywoływana, gdy mój URL: http://xx.xx.xx.xx/MyApp/fbauth

+0

Jak wygląda twoja konfiguracja sprężynowa? – GaryF

Odpowiedz

12

Zakładając ten Filter jest okablowany w web.xml, to nie będzie działać, ponieważ nie jest zarządzany przez wiosnę, to zarządzany przez kontener serwletów. Więc rzeczy takie jak autowiring nie zadziałają.

Jeśli chcesz zdefiniować filtr serwletu jako wiosennym fasoli, to trzeba zdefiniować go w kontekście aplikacji korzeń webapp (posługując się ContextLoaderListener w web.xml), a następnie defining a DelegatingFilterProxy który deleguje do wiosennego zarządzane Bean wykonuj pracę.

Czy naprawdę potrzebujesz do tego filtra serwletów? Co mogę wiedzieć o autorach Facebooka, może to być done just as easily with a Spring HandlerInterceptor. Byłoby to znacznie mniej pracy konfiguracyjnej niż filtr delegujący.

+0

Witaj Skaffmanie! Wielkie dzięki za odpowiedź. Tak, wszystkie moje pliki konfiguracyjne (web.xml i mój application.xml) są w porządku (z ContextLoaderListenner, z delegatingFilterProxy itd.). Ale nawet przy tej konfiguracji nie mogę użyć fasoli w moim filtrze, prawda? – Anthony

+0

Czy możesz podać przykłady kodu, jak zdefiniować filtr serwletów jako fasolę wiosną? – Dejell

+0

Rzeczywiście widziałem http://pro-programmers.blogspot.co.il/2011/08/spring-bean-as-servlet-filter.html artykuł, ale nie używam SpringMCV. czy to pomoże? – Dejell

7

Spójrz na to odpowiedź na miejscu wiosny: http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

W skrócie - można ręcznie wymusić sprężynę zastosować @Autowire adnotacji do filtra:

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); 
} 
5

wiem to teraz stare pytanie, ale nie ma przykładu użycia DelegatingFilterProxy w bieżących odpowiedziach, a jedno ostatnie pytanie z prośbą o taki przykład zostało oznaczone jako duplikat dla tego.

Więc DelegatingFilterProxy to specjalny filtr, który wie o root ApplicationContext i deleguje jego doFilter do komponentu bean.

przykład: MyFilter jest klasa realizacji Filter i myFilter jest fasola sprężyna

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

lub klasy konfiguracji

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

W web.xml, wystarczy zadeklarować DelegatingFilterProxy z tą samą nazwa jako fasola:

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

W ay, jako myBean to prawdziwa fasola, można ją normalnie wstrzyknąć z innymi ziarnami z adnotacjami @Autowired, a jej metoda zostanie wywołana przez . Ponieważ możesz używać metod inicjowania i niszczenia sprężyn, domyślnie init i destroy metody nie będą wywoływane, chyba że określisz parametr początkowy filtra "filtr docelowyFiltr \ fP" jako "prawda".

+0

Próbuję zrobić to w moim projekcie, ale na początku serwera, zgłaszany jest błąd: Poważny: Filtr uruchamiania wyjątku myFilter org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie zdefiniowano komponentu bean o nazwie "myFilter". Próbowałem skonfigurować przez XML i Adnotacje. Wygląda na to, że plik web.xml jest czytany przed skonfigurowaniem komponentu bean. – Alex

+0

Używałem go w wielu projektach i nigdy nie miałem problemu.Ale komponent bean musi być zadeklarowany w kontekście root, a nie w dispatcher-servlet. Powinieneś pokazać, jak deklarujesz swoją fasolę. –

+0

Przykro mi z powodu mojego niezadowolenia, ale jak mogę zadeklarować komponent bean w kontekście root lub dispatcher-servlet? Właśnie utworzyłem klasę konfiguracji, w której umieściłem adnotację "@Configuration", a następnie utworzyłem "@Bean" (odwołując się do klasy myFilter). – Alex

27

byłem stoi ten sam problem i mój pierwszy pomysł był ręcznie wymusić Wiosna zastosować @Autowired adnotacji do filtra jak proponowane tutaj

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

Ale nie podoba mi się pomysł hardcoding nazwa komponentu bean w mojej klasie Java.

znalazłem przejrzysty sposób, który działa jak dobrze:

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

Wielkie dzięki. To naprawdę działa dla mnie. :) – Akash5288

1

byłem coraz pustego wskaźnika podczas uzyskiwania dostępu do usług klasy fasoli w klasie filtra za pomocą autowiring. Przeszukałem ponad 100 linków, ale nie byłem w stanie znaleźć rozwiązania. Używam Spring Boot Application i konfiguracji, która jest wymagana, aby uzyskać komponent bean w klasie filtru:

FilterConfig.java, który zapewnia kontekst aplikacji Obiekt.

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

} 

w klasie filtracji, użyłem tego rodzaju:

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

UserService to nazwa fasoli, które są wymienione w

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

żadna konfiguracja w głównej klasy sprężyny Boot: SpringBootServletInitializer

Powiązane problemy