2015-06-10 42 views
5

Sto imparando a utilizzare una delle nuove funzionalità di AEM6 - Modelli di imbracatura. Ho già recuperato le proprietà di un nodo che segue i passi descritti hereCome adattare un nodo figlio nel modello di sling di 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; 
    } 
} 

e adattato da una risorsa

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

ora ho la gerarchia -

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

Ora desidera recuperare le proprietà di UserAddress.

avevo ottenuto alcuni suggerimenti dalla pagina di documentazione, come ad esempio -

Se l'oggetto iniettato non corrisponde al tipo desiderato e l'oggetto implementa l'interfaccia adattabile, modelli di imbracatura cercheranno di adattarlo. Ciò fornisce la possibilità di creare grafici di oggetti ricchi. Per esempio:

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

    @Inject 
    ImageModel getImage(); 
} 

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

    @Inject 
    String getPath(); 
} 

Quando una risorsa è adatto a MyModel, un'immagine risorsa bambino di nome si adatta automaticamente a un'istanza di ImageModel.

ma non so come implementarlo nelle mie classi. Per favore aiutami con questo.

risposta

4

suona come avete bisogno di una classe separata per il UserAddress per avvolgere le proprietà houseNo, city, state e locality.

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

Basta specchiare la struttura delineata nei modelli di imbracatura.

creare il modello 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 
} 

Questo modello può essere utilizzato nel vostro UserInfo classe:

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

è possibile modificare il comportamento con annotazioni aggiuntive per i valori di default e campi facoltativi, ma questo è l'idea generale.

In generale, i modelli di imbracatura devono essere in grado di gestire un'iniezione di un altro modello purché trovi un adattabile adattabile. In questo caso, è un altro modello di imbracatura, ma l'ho fatto anche con le classi legacy basate sulle fabbriche degli adattatori.