0

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

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

    @Inject
    private ImageModel image;
}

但这不起作用。当我将其用作适应性时它应该可以工作Resource,但我的 ImageModel 和 TextModel 中也需要 SlingHttpServletRequest:

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

    @SlingObject
    private Resource resource;
}

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

4

3 回答 3

1

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

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

    @Self
    private ImageModel image;
}
于 2016-12-02T09:00:00.557 回答
1

使用模型工厂:

    ...
    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);
    ...
    }

这应该可以解决问题。

于 2019-02-07T11:45:03.350 回答
0

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

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

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

于 2016-12-01T11:27:57.703 回答