2012-10-22 12 views
5

मैं वर्तमान में एक Grails आवेदन विकसित कर रहा हूँ और मैं वसंत सुरक्षा और यूआई प्लग-इन के साथ काम कर रहा हूँ।Grails - grails flushing से पहले क्षणिक उदाहरण बचाओ त्रुटि?

उपयोगकर्ता वर्ग::

class User { 

    transient springSecurityService 

    String username 
    String email 
    String password 
    boolean enabled 
    boolean accountExpired 
    boolean accountLocked 
    boolean passwordExpired 

    static belongsTo = [area:Areas] 

     ....... 
} 

क्षेत्र कक्षा:

class Areas { 

    String name 

    static hasMany = [users:User] 

} 

आप देख सकते हैं मैं उपयोगकर्ता क्लास और एक अन्य क्षेत्र कक्षा मैं जो नीचे देखा जा सकता है है के बीच संबंधों को बनाया है कक्षाओं से एक उपयोगकर्ता को एक क्षेत्र से जोड़ा जा सकता है लेकिन एक क्षेत्र में कई उपयोगकर्ता हो सकते हैं। यह सब ठीक काम करता है और जब मैं एप्लिकेशन को बूटस्ट्रैप करता हूं तो सभी डेटा सही ढंग से जोड़े जाते हैं।

object references an unsaved transient instance - save the transient instance before flushing: com.website.Area 
नीचे

नियंत्रक कोड मैं जानकारी को बचाने के लिए उपयोग कर रहा हूँ है: लेकिन मैं निम्नलिखित त्रुटि जब मैं एक फार्म का उपयोग करने के लिए एक नया उपयोगकर्ता बनाने की कोशिश मिल

def save = {  
     def user = lookupUserClass().newInstance(params) 

     if (params.password) { 
      String salt = saltSource instanceof NullSaltSource ? null : params.username 
      user.password = springSecurityUiService.encodePassword(params.password, salt) 
     } 

     if (!user.save(flush: true)) { 
      render view: 'create', model: [user: user, authorityList: sortedRoles()] 
      return 
     } 

     addRoles(user) 
     flash.message = "${message(code: 'default.created.message', args: [message(code: 'user.label', default: 'User'), user.id])}" 
     redirect action: edit, id: user.id 
    } 

और यहाँ एक है

<table> 
     <tbody> 

      <s2ui:textFieldRow name='username' labelCode='user.username.label' bean="${user}" 
          labelCodeDefault='Username' value="${user?.username}"/> 

      <s2ui:passwordFieldRow name='password' labelCode='user.password.label' bean="${user}" 
           labelCodeDefault='Password' value="${user?.password}"/> 

      <s2ui:textFieldRow name='email' labelCode='user.email.label' bean="${user}" 
           labelCodeDefault='E-Mail' value="${user?.email}"/> 

      <s2ui:textFieldRow readonly='yes' name='area.name' labelCode='user.area.label' bean="${user}" 
           labelCodeDefault='Department' value="${area.name}"/> 


      <s2ui:checkboxRow name='enabled' labelCode='user.enabled.label' bean="${user}" 
          labelCodeDefault='Enabled' value="${user?.enabled}"/> 

      <s2ui:checkboxRow name='accountExpired' labelCode='user.accountExpired.label' bean="${user}" 
          labelCodeDefault='Account Expired' value="${user?.accountExpired}"/> 

      <s2ui:checkboxRow name='accountLocked' labelCode='user.accountLocked.label' bean="${user}" 
          labelCodeDefault='Account Locked' value="${user?.accountLocked}"/> 

      <s2ui:checkboxRow name='passwordExpired' labelCode='user.passwordExpired.label' bean="${user}" 
          labelCodeDefault='Password Expired' value="${user?.passwordExpired}"/> 
     </tbody> 
     </table> 

मैं इस में देखा है और मेरा मानना ​​है कि जिस तरह से मैं एक GORM वस्तु को बचाने के लिए कोशिश कर रहा हूँ और मैं शायद बचाने के लिए प्रयास करने से पहले माता-पिता (क्षेत्र) को बचाने चाहिए: क्या जीएसपी तरह लग रहा है का नमूना उपयोगकर्ता। हालांकि उपयोगकर्ता को बनाए जाने से पहले क्षेत्र हमेशा मौजूद रहेगा, इसलिए मुझे फिर से बनाए जाने वाले क्षेत्र की आवश्यकता नहीं है, मैं इसे कैसे संभाल सकता हूं? मैंने थोड़ी सी सफलता के साथ "withTransaction" फ़ंक्शन की कोशिश की, साथ ही

यदि संभव हो तो मैं वास्तव में कुछ मदद की सराहना करता हूं।

धन्यवाद

संपादित करें ......

मैं नियंत्रक में इस लाइन के लिए इस मुद्दे पर नज़र रखी है:

RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt) 

यह मेरे लिए कहना है कि यह समारोह एक को बचाने बुला रहा है उपयोगकर्ता ऑब्जेक्ट के लिए फ़ंक्शन, हालांकि जगहों के संबंधों के साथ इसे पहले क्षेत्र को सहेजने की आवश्यकता है। क्या कोई इस पर मेरी सहायता करने के लिए SpringSecurityUi को जानता है?

धन्यवाद

+0

स्प्रिंगसेक्योरिटी सेवा को नियंत्रक में रखें, न कि डोमेन-क्लास। – marko

+0

क्या आप मुझे एक उदाहरण दे सकते हैं? चूंकि springsecurityservice हमेशा वहां रहा है – user723858

+0

क्या त्रुटि "com.website.Area" वर्ग से संबंधित नहीं है जैसे त्रुटि कहती है? धन्यवाद – user723858

उत्तर

7

से belongsTo दूर करने के लिए त्रुटि संदेश आप देख

object references an unsaved transient instance - save the transient instance before flushing: com.website.Area 

... तब होता है जब आप एक अस्तित्वहीन माता-पिता (यानी क्षेत्र) को सहेजने की कोशिश कर रहे हैं एक बच्चे (i.e उपयोगकर्ता) इकाई से tity। यह संभव है कि पंजीकरण नियंत्रक.register विधि में त्रुटि हो रही है, जैसा कि आपने बताया है, यदि वह जगह है जहां आप एक नया उपयोगकर्ता सहेज रहे हैं।

RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt) 

आपको केवल पंजीकरण कोड अपडेट करने की आवश्यकता है।रजिस्टर से पहले उपयोगकर्ता को क्षेत्र निर्दिष्ट करने के लिए तर्क के साथ तर्क पंजीकृत करें (नीचे दिया गया क्षेत्र पहले से मौजूद है) नीचे - नीचे एक त्वरित उदाहरण है।

class RegistrationController .. 
.. 
def area = Area.findByName(command.areaName) 
def user = lookupUserClass().newInstance(email: command.email, username: command.username, 
       accountLocked: true, enabled: true, area: area) 
RegistrationCode registrationCode = springSecurityUiService.register(user, command.password, salt) 

कुछ नोट:

  • तुम वापस, अपने जीएसपी देखने से "area.name" से गुजर रहे हैं, ताकि आप क्षेत्र नाम शामिल करने के लिए अद्यतन करने के लिए/RegisterCommand ओवरराइड की आवश्यकता होगी
  • क्षेत्र "नाम" पहचानकर्ता सुरक्षित के रूप में आपका उपयोग है? आपकी कक्षा परिभाषा में आपको यह इंगित करने के लिए बाधाएं नहीं हैं कि "नाम" अद्वितीय होगा। Grails command object data binding

फिर भी, उम्मीद है कि मदद करता है: - हो सकता है कि आपके विचार से एक क्षेत्र आईडी वापस गुजर सुरक्षित है

  • आदर्श आप कोई कस्टम गुण संपादक के साथ क्षेत्र देखने संभाल चाहिए यहाँ एक उदाहरण है।

  • +0

    लाइफ सेवर :-) मैंने समाधान के एक हिस्से में समस्या को पहले ही तय कर दिया है, लेकिन इससे वास्तव में मुझे एक और हल करने में मदद मिली :- डी – user723858

    +0

    सर्वश्रेष्ठ उत्तर ... और प्रश्न के लिए अच्छी व्याख्या –

    1

    दूसरी तरफ द्वि-दिशात्मक निर्भरता बारी करने की कोशिश

    class Areas { 
    
        String name 
        static belongsTo = [User] 
        static hasMany = [users:User] 
    } 
    

    मत भूलना उपयोगकर्ता

    1
    class Areas { 
        String name 
        static belongsTo = [User] 
        static hasMany = [users:User] 
    }