2010-09-05 7 views
13

En mi clase de filtro de frijol, agregué alguna dependencia de frijoles (con la anotación @Autowired). Sin embargo, en el método doFilter(), todos mis granos de dependencia tienen nula ...¿Usando algunos granos en la clase Filter bean?

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 es igual a cero (y otros granos dependencia a) ...

¿Me podría ayudar?


De hecho yo no uso noción MVC del lado del servidor (primavera). Para mi cliente lateral utilizo la tecnología Flex y el servlet de BlazeDS se comunica con mi servidor.

Entonces, ese es el motivo, yo uso la noción de filtro de frijol.

Entonces, ¿cómo puedo manejar mi noción de bean sesión en mi Bean filtro?


Skaffman,

he implementado su idea, así que actualizar mi aplicacion.xml con:

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

y mi FacebookOAuthHandler clase:

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

Pero, este método handleRequestInt ernal nunca es llamado cuando mi URL es: http://xx.xx.xx.xx/MyApp/fbauth

+0

¿Cómo se ve la configuración de su resorte? – GaryF

Respuesta

12

Suponiendo que esta Filter está cableado en su web.xml, entonces esto no va a funcionar, ya que no está gestionado por la primavera, que es gestionado por el contenedor de servlets. Entonces, cosas como el autoenvío no funcionarán.

Si desea definir un filtro de servlet como frijol de primavera, a continuación, es necesario definir en el contexto de aplicación de la raíz de la aplicación web (utilizando un ContextLoaderListener en web.xml), y luego defining a DelegatingFilterProxy que delega en el bean Primavera-logrado Haz el trabajo.

Sin embargo, ¿realmente necesita un filtro de servlet para esto? Lo que sé de las autorizaciones de Facebook, podría ser done just as easily with a Spring HandlerInterceptor. Esto sería considerablemente menos trabajo de configuración que un filtro de delegación.

+0

¡Hola Skaffman! Muchas gracias por tu respuesta. Sí, todos mis archivos de configuración (web.xml y my application.xml) están bien (con ContextLoaderListenner, con delegatingFilterProxy, etc.). Pero, incluso con esta configuración, no puedo usar Bean en mi filtro, ¿verdad? – Anthony

+0

¿Puedes dar algunos ejemplos de código sobre cómo definir un filtro de servlet como un bean de primavera? – Dejell

+0

De hecho, vi http://pro-programmers.blogspot.co.il/2011/08/spring-bean-as-servlet-filter.html artículo, pero no estoy usando SpringMCV. ¿Ayudará? – Dejell

7

mirada a esta respuesta en el sitio de la primavera: http://forum.springsource.org/showthread.php?60983-Autowiring-the-servlet-filter

En pocas palabras - se puede forzar manualmente la primavera de aplicar @Autowire anotación a su filtro:

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

sé que una pregunta ahora de edad, pero no hay ningún ejemplo de uso de DelegatingFilterProxy en las respuestas actuales, y una pregunta reciente que solicitaba un ejemplo se marcó como duplicada para esta.

Así que un DelegatingFilterProxy es un filtro especial que sabe acerca de la raíz ApplicationContext y delega su doFilter en un bean.

Ejemplo: MyFilter es una clase que implementa Filter, y myFilter es un grano de primavera

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

o en una clase de configuración

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

En web.xml, que acaba de declarar una DelegatingFilterProxy con igual nombre como el bean:

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

Ese w ay, como myBean es un verdadero bean, puede ser inyectado normalmente con otros beans con anotaciones @Autowired, y su método doFilter será llamado por DelegatingFilterProxy. Como puede utilizar los métodos spring init y destroy, de manera predeterminada no se invocarán los métodos init y destroy, a menos que especifique el filtro init-param de "targetFilterLifecycle" como "verdadero".

+0

Estoy tratando de hacerlo en mi proyecto, pero en el inicio del servidor, se produce un error: Severo: filtro de inicio de excepción myFilter org.springframework.beans.factory.NoSuchBeanDefinitionException: No se ha definido ningún bean llamado 'myFilter'. Intenté configurar a través de XML y Anotación. Parece que web.xml se lee antes de que se configure bean. – Alex

+0

Lo usé en muchos proyectos y nunca tuve ningún problema.Pero el bean debe declararse en contexto raíz, no en el servlet dispatcher uno. Debes mostrar cómo declaras Bean. –

+0

Disculpe mi rookiness, pero ¿cómo puedo declarar un bean en el contexto raíz o en el contexto del servlet dispatcher? Acabo de crear una clase de configuración en la que he puesto una anotación "@Configuration", luego creé un "@Bean" (refiriéndose a la clase myFilter). – Alex

27

que estaba enfrentando el mismo problema y mi primera idea era forzar manualmente la primavera de aplicar la anotación @Autowired al filtro como el que aquí se propone

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

Pero no me gusta la idea de la hardcoding nombre de frijol en mi clase de Java.

He encontrado una manera más limpia que funciona tan bien:

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

Muchas gracias. Esto realmente funciona para mí. :) – Akash5288

1

que estaba recibiendo puntero nulo mientras que el acceso frijol clase de servicio en la clase de filtro usando Autowiring. Busqué más de 100 enlaces pero no pude encontrar una solución. Estoy usando Spring Boot Application y la configuración que se requiere para obtener bean en la clase de filtro:

FilterConfig.java que proporciona el objeto de contexto de la aplicación.

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

} 

en la clase de filtro, que utiliza esto como:

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

UserService este es el nombre de frijol que se menciona en

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

No Configuración en la clase principal del arranque de la primavera: SpringBootServletInitializer

Cuestiones relacionadas