2016-09-20 81 views
0

2 Sling模型已給出,我想注入其中一個模型。這是可能的註釋還是我需要創建一個PostContruct方法作爲解決方法?從Sling模型中注入另一個Sling模型

例子:

A型

@Model(adaptables = Resource.class) 
public class ModelA { 
    @ValueMapValue(name = "jcr:title", injectionStrategy = InjectionStrategy.OPTIONAL) 
    private String title; 

    @Inject // Not working! 
    private ModelB modelB; 
} 

B型

@Model(adaptables = Resource.class) 
public class ModelB { 
    @ValueMapValue(injectionStrategy = InjectionStrategy.OPTIONAL) 
    private String text; 

} 
+0

是由'ModelB'由'ModelA'代表的資源的一個子資源代表的資源? – Jens

+0

不,它是相同的資源。 – nicolas

+1

因此,您有一個'ResourceA',並且想要將該資源同時適應'ModelA'和'ModelB'?只要「ModelB」表示的資源是由「ModelA」表示的資源的子資源,您想要執行的操作就是可能的。請參閱https://sling.apache.org/documentation/bundles/models.html#adaptations – Jens

回答

0

你不會成爲能夠注入ModelB到MODELA,你可以做的是獲取資源在ModelA中的實例,並將其調整爲ModelB

@Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) 
public class ModelA { 
    @Inject 
    @Via("resource") 
    @Named("jcr:title") 
    private String title; 

    @Inject 
    private Resource resource; 

    @PostConstruct 
    public void init() { 
    final ModelB modelb = resource.adaptTo(ModelB.class); 
    } 
} 
+0

是的,這就是我建議的解決方法.... 沒有其他方式如何避免它? @SlingObject不起作用... – nicolas

+0

它實際上不是一種解決方法,吊索模型基於適配器,而Inject更多地是爲了方便DI而不能調用適配器調用。如果查看SlingModel的Sling代碼,您將看到Model註釋處理其他註釋的方式,並且處於當前狀態,但不會調用adaptTo –

+1

通過自適應使用嵌套模型的概念是從開始。在1.0中,我相信如果其他注入器失敗了,它就會被隱式地嘗試,然後在1.1中通過自注釋來明確聲明 –

4

由於Sling Models 1.1.0版本可以使用@Self註釋來注入可以從當前適應性改編的模型。在這種情況下,ResourceModelA

注入自適應對象本身(如果字段的類匹配或是超類型)。如果存在@Self註釋,則嘗試將適應性修改爲字段類型。

@Model(adaptables = Resource.class) 
public class ModelA { 
    @ValueMapValue(name = "jcr:title", injectionStrategy = InjectionStrategy.OPTIONAL) 
    private String title; 

    @Inject // This should works 
    @Self 
    private ModelB modelB; 
} 
+1

你甚至不需要指定'''Inject''','''@Inject'''是通用注射,其中@Self是注射的特定形式。 –