2010-09-29 11 views
8

मेरे पास सत्र में उपयोगकर्ता को पाने और सेट करने की एक सेवा है। यदि उपयोगकर्ता में लॉग इन किया गया है और सोचा है कि फ़िल्टर सबसे अच्छा तरीका होगा तो मुझे प्रत्येक उपयोगकर्ता जानकारी में प्रत्येक उपयोगकर्ता जानकारी में पास करना होगा, इसलिए मुझे प्रत्येक नियंत्रक/क्रिया में डुप्लिकेट करने की आवश्यकता नहीं है। जब मैं अनुप्रयोग चलाने, यह इस त्रुटि मिलती है:क्या मैं Grails में फ़िल्टर में एक सेवा इंजेक्ट कर सकता हूं?

Error creating bean with name 'userService': Scope 'session' is not active for the current thread 

मेरे फिल्टर इस तरह दिखता है:

class SecurityFilters { 
    def userService 

    def filters = { 
     setUser(controller:'*', action:'*') { 
      before = { 
       if (userService.isLoggedIn()) { 
        request.user = userService.getUser() 
       } else { 
        request.user = null 
       } 
      } 
     } 
    } 
} 

मैं मैं सिर्फ अंत में session.user के माध्यम से उपयोगकर्ता उपयोग कर सकते हैं पता है, लेकिन मैं होना चाहता हूँ userService.isLoggedIn() को कॉल करने में सक्षम है जो मैं आसानी से दृश्य के माध्यम से नहीं कर सकता। तो क्या फ़िल्टर में सेवा को इंजेक्ट करने का कोई तरीका है, या क्या मुझे सिर्फ userService.isLoggedIn() को लपेटने के लिए टैगलिब बनाना चाहिए?

+0

ठीक है, जवाब मैं नहीं कर सकता था। मैंने एक टिप्पणी जो स्पष्ट रूप से हटा दी गई है, कह रही है कि मैं एक अलग दृष्टिकोण नहीं दे सका। – varikin

उत्तर

2

ऐसा लगता है कि फ़िल्टर में सेवाओं के साथ कुछ समस्याएं हैं। यह बग आपको सही दिशा में इंगित कर सकता है: https://jira.grails.org/browse/GRAILS-5982

आप ApplicationContext के माध्यम से अपनी सेवा का संदर्भ प्राप्त करने का भी प्रयास कर सकते हैं। यहां एक उदाहरण दिया गया है: How do I get an instance of a Grails service programmatically?

9

ऐसा लगता है कि समस्या यह है कि आपका उपयोगकर्ता सेवा सत्र में डूब गया है, और उस समय एक सत्र आवश्यक नहीं है जब फ़िल्टर में सेवा को इंजेक्ट करने का प्रयास होता है।

अपने userService जरूरी सत्र-दायरे वाले है तो आप अपने वसंत config में एक scoped प्रॉक्सी का उपयोग करने की जरूरत है। जैसे grails एप्लिकेशन के अंतर्गत/conf/वसंत/resources.groovy में:

import com.your.service.UserService 
... 
userServiceSession(UserService) 
{ bean -> 
    bean.scope = 'session' 
} 
userServiceSessionProxy(org.springframework.aop.scope.ScopedProxyFactoryBean) 
{ 
    targetBeanName = 'userServiceSession' 
    proxyTargetClass = true 
} 

फिर अपने SecurityFilter में अपने इंजेक्शन चर नाम बदलने:

def userServiceSessionProxy 

(और स्पष्ट रूप से नाम बदलने जहां आप इसे कहीं और कक्षा में उपयोग करें)।

इस क्या करना चाहिए इंजेक्शन समय में प्रॉक्सी इंजेक्षन, लेकिन केवल समय फिल्टर निष्पादित किया जाता है पर वास्तविक सेवा करने के लिए जाना (जब वहाँ एक सत्र है)।

नोट: यकीन नहीं यह कर अभी भी अन्य स्थानों पर जहां एक सत्र (जैसे नियंत्रक) नहीं होगा अभी भी 'userService' के रूप में सेवा का संदर्भ देता है कि क्या नहीं तो आप resources.groovy में userService को userServiceSession नाम बदलने के लिए सक्षम हो सकता है (और तदनुसार लक्ष्यबीननाम अपडेट करें)।

+0

यह एक वैध समाधान की तरह लगता है, लेकिन इसके बजाय मैंने टैगलिब पर स्विचिंग का चयन किया। सरल माना जाता है। – varikin

0
import org.codehaus.groovy.grails.web.context.ServletContextHolder 
import org.springframework.context.ApplicationContext 
import org.springframework.web.context.support.WebApplicationContextUtils 
class SecurityFilters { 
    def userService 

    def filters = { 
     setUser(controller:'*', action:'*') { 
      before = { 
       def servletCtx = ServletContextHolder.getServletContext() 
       ApplicationContext applicationContext = WebApplicationContextUtils. 
        getRequiredWebApplicationContext(servletCtx) 
       userService =applicationContext.getBean('userService') 
       if (userService.isLoggedIn()) { 
        request.user = userService.getUser() 
       } else { 
        request.user = null 
       } 
      } 
     } 
    } 
} 
संबंधित मुद्दे