【问题标题】:SlingModels: Injecting other Model from SlingHttpServletRequestSlingModels:从 SlingHttpServletRequest 注入其他模型
【发布时间】:2016-12-01 11:08:25
【问题描述】:

other question 的一个原因是以下用例:我想创建一个 TextImageModel,它使用我的 ImageModel 作为注入属性并扩展我的 TextModel:

@Model(adaptables = {SlingHttpServletRequest.class})
public class TextImageModel extends TextModel {

    @Inject
    private ImageModel image;
}

但这不起作用。 should work 当我使用 Resource 作为自适应时,但我的 ImageModel 和 TextModel 中也需要 SlingHttpServletRequest:

@Model(adaptables = {SlingHttpServletRequest.class})
public class ImageModel {
    @SlingObject
    private SlingHttpServletRequest request;

    @SlingObject
    private Resource resource;
}

如何使用自适应请求注入 ImageModel? 图片资源是一个名为image的子资源

【问题讨论】:

    标签: aem sling-models


    【解决方案1】:

    您可以使用@Self 代替@Inject,但您在ImageModel 中将拥有与在TextImageModel 中相同的资源。不是您想要的孩子“形象”。 Afaik 从 Request 适配时,总是从 Request 中读取资源。

    @Model(adaptables = {SlingHttpServletRequest.class})
    public class TextImageModel extends TextModel {
    
        @Self
        private ImageModel image;
    }
    

    【讨论】:

    • 如果 ImageModel 是从 Resource 改编而来,你需要添加一个 @Via("request")
    【解决方案2】:

    使用模型工厂:

        ...
        import com.adobe.cq.wcm.core.components.models.Image;
        import org.apache.sling.models.factory.ModelFactory;
        ...
        @Inject 
        private ModelFactory modelFactory;
        @Self 
        private SlingHttpServletRequest request;
    
        private Image image;
    
        @PostConstruct 
        protected void postInit() {
                image = modelFactory.getModelFromWrappedRequest(request, resource.getChild("image"), Image.class);
        ...
        }
    

    这应该可以解决问题。

    【讨论】:

      【解决方案3】:

      如果你想从其他特定类型而不是你的自适应注入,那么你可以使用@Inject @Via("resource")

      更多:https://sling.apache.org/documentation/bundles/models.html#via

      我不确定这是否适用于模型而不是属性

      【讨论】:

      • 查看我的编辑,我的 ImageModel 只能通过 SlingHttpServletRequest 进行调整,因为我在 @PostConstruct 中需要它
      • 从资源中改编 ImageModel 时需要一个 via。事实上,@Self 会有所帮助。
      猜你喜欢
      • 2017-04-15
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多