Aem6

2015-06-10 10 views
5

के स्लिंग मॉडल में एक बच्चे नोड को अनुकूलित करने के लिए कैसे मैं AEM6 - स्लिंग मॉडल की नई सुविधाओं में से एक का उपयोग करना सीख रहा हूं। मैं पहले से ही चरणों का पालन एक नोड के गुणों hereAem6

@Model(adaptables = Resource.class) 
public class UserInfo { 

    @Inject @Named("jcr:title") 
    private String title; 

    @Inject @Default(values = "xyz") 
    private String firstName; 

    @Inject @Default(values = "xyz") 
    private String lastName; 

    @Inject @Default(values = "xyz") 
    private String city; 

    @Inject @Default(values = "aem") 
    private String technology; 

    public String getFirstName() { 
    return firstName; 
    } 

    public String getLastName() { 
    return lastName; 
    } 

    public String getTechnology() { 
    return technology; 
    } 

    public String getTitle() { 
    return title; 
    } 
} 

वर्णित दिलवाया और एक संसाधन

UserInfo userInfo = resource.adaptTo(UserInfo.class); 

अब मैं पदानुक्रम के रूप में है से यह ढाल लिया है -

+ UserInfo (firstName, lastName, technology) 
    | 
    + UserAddress (houseNo, locality, city, state) 

अब मैं UserAddress के गुणों को प्राप्त करना चाहते हैं।

मैं जैसे प्रलेखन पृष्ठ से कुछ संकेत, मिला था - इंजेक्शन वस्तु इच्छित प्रकार से मेल नहीं खाता

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

@Model(adaptables = Resource.class) 
public interface MyModel { 

    @Inject 
    ImageModel getImage(); 
} 

@Model(adaptables = Resource.class) 
public interface ImageModel { 

    @Inject 
    String getPath(); 
} 

जब एक संसाधन MyModel करने के लिए अनुकूलित किया गया है, एक बच्चे संसाधन नामित छवि स्वचालित रूप से ImageModel का एक उदाहरण के लिए अनुकूलित किया गया है।

लेकिन मुझे नहीं पता कि इसे अपने वर्गों में कैसे कार्यान्वित किया जाए। कृपया इसमें मेरी सहायता करें।

उत्तर

4

ऐसा लगता है कि आप houseNo, city, state और locality गुण रैप करने के लिए UserAddress के लिए एक अलग वर्ग की जरूरत है।

+ UserInfo (firstName, lastName, technology) 
    | 
    + UserAddress (houseNo, locality, city, state) 

बस अपनी स्लिंग मॉडल में उल्लिखित संरचना को मिरर करें।

UserAddress मॉडल बनाएं:

@Model(adaptables = Resource.class) 
public class UserAddress { 

    @Inject 
    private String houseNo; 

    @Inject 
    private String locality; 

    @Inject 
    private String city; 

    @Inject 
    private String state; 

    //getters 
} 

यह मॉडल तो अपने UserInfo कक्षा में इस्तेमाल किया जा सकता:

@Model(adaptables = Resource.class) 
public class UserInfo { 

    /* 
    * This assumes the hierarchy you described is 
    * mirrored in the content structure. 
    * The resource you're adapting to UserInfo 
    * is expected to have a child resource named 
    * userAddress. The @Named annotation should 
    * also work here if you need it for some reason. 
    */ 
    @Inject 
    @Optional 
    private UserAddress userAddress; 

    public UserAddress getUserAddress() { 
     return this.userAddress; 
    } 

    //simple properties (Strings and built-in types) omitted for brevity 
} 

आप मूलभूत मूल्यों और वैकल्पिक फ़ील्ड लेकिन इस के लिए अतिरिक्त एनोटेशन के साथ व्यवहार ठीक कर सकते हैं सामान्य विचार है।

सामान्य रूप से, स्लिंग मॉडल किसी अन्य मॉडल के इंजेक्शन को संभालने में सक्षम होना चाहिए जब तक कि यह उचित अनुकूलनीय न हो। इस मामले में, यह एक और स्लिंग मॉडल है लेकिन मैंने इसे एडाप्टर कारखानों के आधार पर विरासत कक्षाओं के साथ भी किया है।