2010-09-05 13 views
13

मेरे फ़िल्टर बीन कक्षा में, मैंने कुछ बीन्स निर्भरता (@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 अशक्त (और अन्य dependancy सेम करने के लिए) पर बराबर है ...

क्या आप मेरी मदद कर सकते हैं में?


वास्तव में मैं सर्वर पक्ष (वसंत) पर एमवीसी धारणा का उपयोग नहीं करता हूं। मेरे साइड क्लाइंट के लिए मैं फ्लेक्स टेक्नोलॉजी और ब्लेज़डीएस सर्वलेट टन का उपयोग अपने सर्वर के साथ संवाद करता हूं।

तो, यही कारण है कि, मैं फ़िल्टर बीन धारणा का उपयोग करता हूं।

तो, मैं अपने फ़िल्टर बीन में अपने सत्र बीन धारणा को कैसे संभाल सकता हूं? ,

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

लेकिन:


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 वर्ग यह विधि handleRequestInt ernal कहा जाता है कभी नहीं है जब मेरे यूआरएल है: http://xx.xx.xx.xx/MyApp/fbauth

+0

आपकी वसंत कॉन्फ़िगरेशन कैसा दिखता है? – GaryF

उत्तर

12

मानते हुए इस Filter, अपने web.xml में वायर्ड है, तो यह काम करने के लिए नहीं जा रहा है के बाद से यह वसंत द्वारा प्रबंधित नहीं है, यह सर्वलेट कंटेनर द्वारा प्रबंधित। तो ऑटोवॉयरिंग जैसी चीज़ें काम नहीं करेंगी।

आप वसंत सेम के रूप में एक सर्वलेट फिल्टर को परिभाषित करना चाहते हैं, तो आप (एक ContextLoaderListener web.xml में उपयोग करते हुए) वेब ऐप्लिकेशन की जड़ आवेदन संदर्भ में परिभाषित करने की जरूरत है, और फिर defining a DelegatingFilterProxy जो करने के लिए अपने स्प्रिंग से प्रबंधित सेम के प्रतिनिधियों काम करो।

हालांकि, क्या आपको इसके लिए वास्तव में एक सर्वलेट फ़िल्टर की आवश्यकता है? फेसबुक ऑथ सामान के बारे में मुझे क्या पता है, यह done just as easily with a Spring HandlerInterceptor हो सकता है। प्रतिनिधिमंडल फ़िल्टर की तुलना में यह काफी कम विन्यास कार्य होगा। वसंत की साइट पर इस जवाब पर

+0

हाय स्काफमैन! आपके उत्तर के लिए बहूत बहूत धन्यवाद। हाँ, मेरी सभी कॉन्फ़िगरेशन फ़ाइलें (web.xml, और my application.xml) ठीक हैं (ContextLoaderListenner के साथ, प्रतिनिधि FilterProxy, आदि के साथ)। लेकिन, इस कॉन्फ़िगरेशन के साथ भी, मैं अपने फ़िल्टर में बीन का उपयोग नहीं कर सकता, यह सही है? – 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> 

वह डब्ल्यू ए, myBean एक सच्ची बीन है, इसे सामान्यतः @Autowired एनोटेशन के साथ अन्य बीन्स के साथ इंजेक्शन दिया जा सकता है, और इसकी doFilter विधि DelegatingFilterProxy द्वारा कॉल की जाएगी। जैसा कि आप वसंत init और विधियों को नष्ट कर सकते हैं, डिफ़ॉल्ट रूप से init और destroy विधियों को तब तक नहीं कहा जाएगा जब तक कि आप "targetFilterLifecycle" फ़िल्टर init-param को "सत्य" के रूप में निर्दिष्ट न करें।

+0

मैं इसे अपने प्रोजेक्ट में करने की कोशिश कर रहा हूं, लेकिन सर्वर शुरू होने पर, एक त्रुटि फेंक दी जाती है: गंभीर: अपवाद फ़िल्टर शुरू करना मेरा फ़िल्टर org.springframework.beans.factory.No.SuchBeanDefinitionException: 'myFilter' नामक कोई बीन परिभाषित नहीं किया गया है। मैंने एक्सएमएल और एनोटेशन के माध्यम से कॉन्फ़िगर करने का प्रयास किया है। ऐसा लगता है कि बीन कॉन्फ़िगर करने से पहले web.xml पढ़ा जाता है। – Alex

+0

मैंने इसे कई परियोजनाओं में उपयोग किया, और कभी भी कोई समस्या नहीं थी।लेकिन बीन रूट संदर्भ में घोषित किया जाना चाहिए, प्रेषक-सर्वलेट में नहीं। आपको दिखाना चाहिए कि आप कैसे बीन घोषित करते हैं। –

+0

मुझे मेरी रूचि के लिए खेद है, लेकिन मैं रूट या प्रेषक-सर्वलेट संदर्भ में या तो एक बीन कैसे घोषित कर सकता हूं? मैंने अभी एक कॉन्फ़िगरेशन क्लास बनाया है जिसमें मैंने "@ कॉन्फ़िगरेशन" एनोटेशन डाला है, फिर एक "@ बीन" बनाया गया है (मेरी फिल्टर क्लास को रेफर करना)। – Alex

27

मैं एक ही समस्या है और मेरा पहला विचार का सामना करना पड़ रहा था मैन्युअल रूप से फिल्टर करने के लिए @Autowired एनोटेशन लागू करने के लिए स्प्रिंग मजबूर करना था, यहां प्रस्तावित की तरह

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

लेकिन मैं हार्डकोड का विचार पसंद नहीं है मेरी जावा कक्षा में बीन नाम।

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

बहुत धन्यवाद। यह वास्तव में मेरे लिए काम करता है। :) – Akash5288

1

मैं नल पॉइंटर हो रही थी, जबकि फिल्टर कक्षा में सेवा वर्ग सेम तक पहुँचने Autowiring का उपयोग कर:

मैं एक क्लीनर तरीका है कि रूप में अच्छी तरह से काम करता है पाया। मैंने 100 से अधिक लिंक खोजे लेकिन समाधान खोजने में सक्षम नहीं। मैं वसंत बूट एप्लिकेशन और कॉन्फ़िगरेशन का उपयोग कर रहा हूं जो फिल्टर वर्ग में बीन प्राप्त करने के लिए आवश्यक है:

फ़िल्टरकोनफिग.जावा जो अनुप्रयोग संदर्भ ऑब्जेक्ट प्रदान करता है।

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

UserService इस सेम नाम जो

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

वसंत बूट के मुख्य वर्ग में नहीं विन्यास में बताया गया है है:

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

} 

फ़िल्टर कक्षा में, मैं इस तरह इस्तेमाल किया SpringBootServletInitializer

संबंधित मुद्दे