2016-09-20 84 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是注射的特定形式。 –