【问题标题】:Inject another Sling model from Sling Model从 Sling Model 注入另一个 Sling 模型
【发布时间】:2017-01-28 09:12:21
【问题描述】:

给出了 2 个 Sling 模型,我想注入其中一个。这是否可以通过注释实现,还是我需要创建 PostContruct 方法作为解决方法?

例子:

模型 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;

}

【问题讨论】:

  • ModelB代表的资源是ModelA代表的资源的子资源吗?
  • 不,是同一个资源。
  • 那么您有一个ResourceA,并且您想将该资源同时适应ModelAModelB?只要ModelB代表的资源是ModelA代表的资源的子资源,你想做的就可以了。见sling.apache.org/documentation/bundles/models.html#adaptations

标签: aem sling sling-models


【解决方案1】:

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

【讨论】:

  • 你甚至不需要指定@Inject@Inject是泛型注入,其中@Self是注入的具体形式。
【解决方案2】:

你无法将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);
   }
}

【讨论】:

  • 是的,这就是我建议的解决方法......没有其他方法可以避免它吗? @SlingObject 也不起作用...
  • 其实不是变通办法,sling模型是基于adapter的,inject更多是为了方便DI,不能调用adapter调用。如果您查看 SlingModel 的 Sling 代码,您将看到 Model 注释处理另一个注释并且处于当前状态的方式不会调用 adaptTo
  • 通过自适应使用嵌套模型的概念从一开始就是吊索模型设计的一部分。在 1.0 中,我相信如果其他注入器失败,它是隐式尝试的,然后在 1.1 中,它通过 Self 注释明确说明
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 2020-07-23
  • 1970-01-01
  • 2015-12-12
  • 2015-10-25
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多