2010-09-05 1 views
13

В моем классе компонента фильтра я добавил некоторую зависимость от beans (с аннотацией @Autowired). Но в методе doFilter(), все мои бобы зависимостей имеют нулевой ...Использование некоторых компонентов в классе фильтров фильтра?

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 равно в нуль (и других зависимостях бобы) ...

Не могли бы вы мне помочь?

Фактически, я не использую понятие MVC на стороне сервера (весна). Для моего стороннего клиента я использую технологию Flex, а сервлет slaveDS - связь с моим сервером.

Так вот, я использую понятие компонента фильтра.

Итак, как я могу обрабатывать свой компонент сеанса в моем компоненте фильтра?


Skaffman,

Я реализовал свою идею, так что я могу обновить свой application.xml с:

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

и мой FacebookOAuthHandler класса:

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

Но, этот метод handleRequestInt ernal никогда не вызывается, когда мой URL является: http://xx.xx.xx.xx/MyApp/fbauth

+0

Как выглядит ваша конфигурация пружины? – GaryF

ответ

12

Если предположить, что этот Filter подключен в вашем web.xml, то это не будет работать, так как он не управляется Spring, это управляется контейнером сервлетов. Таким образом, такие вещи, как автоуслуги, не будут работать.

Если вы хотите, чтобы определить сервлет фильтр как Spring бина, то вам нужно определить его в контексте корневого приложения веб-приложение в (с помощью ContextLoaderListener в web.xml), а затем defining a DelegatingFilterProxy который делегирует к вашему Спринг-управляемым компонентом выполнять работу.

Однако для этого вам нужен фильтр сервлетов? Что то, что я знаю об аутсайдерах Facebook, это может быть done just as easily with a Spring HandlerInterceptor. Это будет значительно меньше работы по настройке, чем делегирующий фильтр.

+0

Привет, Скаффман! Большое спасибо за ваш ответ. Да, все мои файлы конфигурации (web.xml и мой application.xml) в порядке (с ContextLoaderListenner, с делегированиемFilterProxy и т. Д.). Но даже с этой конфигурацией я не могу использовать bean-фильтр в моем фильтре, верно? – Anthony

+0

Можете ли вы привести примеры кода, как определить фильтр сервлетов в качестве весеннего компонента? – Dejell

+0

Я действительно видел http://pro-programmers.blogspot.co.il/2011/08/spring-bean-as-servlet-filter.html статью, но я не использую SpringMCV. это поможет? – Dejell

7

Посмотрите на этот ответ на сайте весны: http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

Вкратце - вы можете вручную заставить пружину применить @Autowire аннотацию к фильтру:

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

Я знаю, что это прямо сейчас старый вопрос, но нет примера использования DelegatingFilterProxy в текущих ответах, и один последний вопрос, задающий такой пример, был помечен как дубликат для этого.

А DelegatingFilterProxy - специальный фильтр, который знает о корне ApplicationContext и делегирует его doFilter компоненту.

Пример: MyFilter является классом реализации Filter и MyFilter является пружина фасоли

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

или в классе конфигурации

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

В web.xml, вы просто объявить DelegatingFilterProxy с таким же название как фасоль:

<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, так как myBean является истинным бобом, он может быть инжектирован обычно другими бобами с аннотациями @Autowired, а его метод doFilter будет вызываться DelegatingFilterProxy. Поскольку вы можете использовать методы Spring init и destroy, по умолчанию методы init и destroy не будут вызываться, если вы не укажете init-param фильтра targetFilterLifecycle как «true».

+0

Я пытаюсь сделать это в своем проекте, но при запуске сервера выдается ошибка: Сильный: Исходный стартовый фильтр myFilter org.springframework.beans.factory.NoSuchBeanDefinitionException: бит bean с именем 'myFilter' не определен. Я пытался настроить через XML и Annotation. Кажется, что web.xml читается перед настройкой bean-компонента. – Alex

+0

Я использовал его во многих проектах и ​​никогда не испытывал никаких проблем.Но компонент должен быть объявлен в корневом контексте, а не в диспетчер-сервлет-одном. Вы должны показать, как вы объявляете свой bean-компонент. –

+0

Прошу прощения за мой новичок, но как я могу объявить bean-компонент в корневом или диспетчер-сервлет-контексте? Я только что создал класс конфигурации, в котором я разместил аннотацию «@Configuration», а затем создал «@Bean» (ссылаясь на класс myFilter). – Alex

27

Я столкнулся с той же проблемой, и моя первая мысль была вручную заставить Spring применить @Autowired аннотацию к фильтру, как предложено здесь

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

Но мне не нравится идея жесткого кодирования bean name в моем классе Java.

Я нашел более чистый способ, который работает так:

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

Спасибо большое. Это действительно работает для меня. :) – Akash5288

1

Я получаю нулевой указатель при обращении службы класса боба в классе фильтра с помощью автоматического связывания. Я искал более 100 ссылок, но не смог найти решение. Я использую Spring Boot Application и конфигурацию, необходимую для получения bean-компонента в классе фильтра:

FilterConfig.java, который предоставляет контекст приложения Object.

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

} 

в классе фильтра, я использовал это как:

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

UserService это имя боб, который упоминается в

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

Нет конфигурации в главном классе яровой Boot: SpringBootServletInitializer

 Смежные вопросы

  • Нет связанных вопросов^_^