web-dev-qa-db-ja.com

Filter BeanクラスでいくつかのBeanを使用していますか?

フィルタBeanクラスで、いくつかのBean依存関係を追加しました(_@Autowired_アノテーション付き)。しかし、メソッドdoFilter()では、すべての依存関係Beanに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はnull(および他の依存関係Bean)で等しい...

私たちを手伝ってくれますか ?


実際、私はサーバー側(春)でMVCの概念を使用していません。サイドクライアントには、FlexテクノロジーとBlazeDSサーブレットを使用してサーバーと通信します。

それが理由です。私はフィルターBeanの概念を使用しています。

では、フィルターBeanでセッションBeanの概念をどのように処理できますか?


スカフマン、

私はあなたのアイデアを実装したので、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;
}
_

しかし、このメソッドhandleRequestInternalは、私のURLが次の場合には呼び出されません: http://xx.xx.xx.xx/MyApp/fbauth

18
Anthony

私は同じ問題に直面していました。私の最初のアイデアは、ここで提案されているように、手動でSpringに@Autowiredアノテーションをフィルターに適用させることでした。

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

しかし、私はJavaクラスでBean名をハードコーディングするという考えは好きではありません。

私は同様に機能するよりクリーンな方法を見つけました:

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

このFilterweb.xmlに接続されているとすると、Springによって管理されておらず、サーブレットコンテナによって管理されているため、これは機能しません。したがって、自動配線のようなものは機能しません。

サーブレットフィルターをSpringBeanとして定義する場合は、webappのルートアプリケーションコンテキストで(web.xmlのContextLoaderListenerを使用して)定義してから、 DelegatingFilterProxy これはSpring管理のBeanに作業を委任します。

ただし、これには本当にサーブレットフィルタが必要ですか? Facebookの認証について私が知っていることは、これは Spring HandlerInterceptor と同じくらい簡単にできることです。これは、委任フィルターよりも構成作業が大幅に少なくなります。

13
skaffman

私はそれが今では古い質問であることを知っていますが、現在の回答でDelegatingFilterProxyの使用例はなく、そのような例を求める最近の質問の1つは、この質問の重複としてマークされました。

したがって、DelegatingFilterProxyは、ルートApplicationContextを認識し、そのdoFilterをBeanに委任する特別なフィルターです。

例:MyFilterFilterを実装するクラスであり、myFilterはSpringBeanです。

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

または構成クラス内

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

Web.xmlでは、Beanと同じ名前の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>

そうすれば、myBeanは真のBeanであるため、通常は@Autowiredアノテーションが付いた他のBeanと一緒に注入でき、そのdoFilterメソッドはDelegatingFilterProxyによって呼び出されます。 Springのinitメソッドとdestroyメソッドを使用できるため、「targetFilterLifecycle」フィルターのinit-paramを「true」として指定しない限り、デフォルトではinitメソッドとdestroyメソッドは呼び出されません。

7
Serge Ballesta

春のサイトでこの回答を見てください: 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);
}
7
Dewfy

自動配線を使用してフィルタークラスのサービスクラスBeanにアクセスしているときにnullポインターを取得していました。 100以上のリンクを検索しましたが、解決策を見つけることができませんでした。フィルタクラスでBeanを取得するために必要なSpringBootアプリケーションと構成を使用しています:

アプリケーションコンテキストオブジェクトを提供するFilterConfig.Java。

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

 }

filterクラスでは、次のように使用しました。

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

UserServiceこれはで言及されているBean名です

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

Spring Bootのメインクラスに構成がありません:SpringBootServletInitializer

1