2015-06-10 26 views
5

Uczę się korzystać z jednej z nowych funkcji AEM6 - Sling Models. I już pobrane właściwości węzła wykonanie kroków opisanych hereJak zaadaptować węzeł podrzędny w modelu zawiesia AEM6

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

i dostosować go z zasobu

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

teraz mam hierarchię jako -

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

Teraz chcesz pobrać właściwości urządzenia UserAddress.

ja dostałem kilka wskazówek ze strony dokumentacji, takich jak -

Jeśli wstrzyknięto obiekt nie pasuje żądany rodzaj i przedmiot realizuje Adaptable interfejs, Sling modele postara się go dostosować. Zapewnia to możliwość tworzenia bogatych wykresów obiektów. Na przykład:

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

    @Inject 
    ImageModel getImage(); 
} 

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

    @Inject 
    String getPath(); 
} 

Gdy zasób jest przystosowany do MyModel, zasób dziecko o nazwie obraz jest automatycznie dostosowana do instancji ImageModel.

, ale nie wiem, jak to wdrożyć w moich własnych klasach. Proszę, pomóż mi się z tym uporać.

Odpowiedz

4

Brzmi jak trzeba oddzielną klasę dla UserAddress zawijać houseNo, city, state i locality właściwości.

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

Wystarczy odzwierciedlić strukturę nakreśloną w swoich modelach zawiesia.

Tworzenie UserAddress model:

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

    @Inject 
    private String houseNo; 

    @Inject 
    private String locality; 

    @Inject 
    private String city; 

    @Inject 
    private String state; 

    //getters 
} 

Model ten może być następnie wykorzystane w klasie 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 
} 

można dostosować zachowanie z dodatkowymi adnotacjami do wartości domyślnych i pola opcjonalne, ale ten to ogólna idea.

Zasadniczo modele z procesem powinny być w stanie obsłużyć iniektowanie innego modelu, o ile znajdzie odpowiednie dopasowanie. W tym przypadku jest to inny model Slinga, ale zrobiłem to również z klasami starszymi opartymi na fabrykach adapterów.