フィルタ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
私は同じ問題に直面していました。私の最初のアイデアは、ここで提案されているように、手動で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());
}
このFilter
がweb.xml
に接続されているとすると、Springによって管理されておらず、サーブレットコンテナによって管理されているため、これは機能しません。したがって、自動配線のようなものは機能しません。
サーブレットフィルターをSpringBeanとして定義する場合は、webappのルートアプリケーションコンテキストで(web.xmlのContextLoaderListener
を使用して)定義してから、 DelegatingFilterProxy
これはSpring管理のBeanに作業を委任します。
ただし、これには本当にサーブレットフィルタが必要ですか? Facebookの認証について私が知っていることは、これは Spring HandlerInterceptor
と同じくらい簡単にできることです。これは、委任フィルターよりも構成作業が大幅に少なくなります。
私はそれが今では古い質問であることを知っていますが、現在の回答でDelegatingFilterProxy
の使用例はなく、そのような例を求める最近の質問の1つは、この質問の重複としてマークされました。
したがって、DelegatingFilterProxy
は、ルートApplicationContext
を認識し、そのdoFilter
をBeanに委任する特別なフィルターです。
例:MyFilter
はFilter
を実装するクラスであり、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
メソッドは呼び出されません。
春のサイトでこの回答を見てください: 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);
}
自動配線を使用してフィルタークラスのサービスクラス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