0

我有一个属性,其中包含内容文件中所需页面的路径

...
<some_block
    ...
    sling:resourceType="some_path_to_some_component"
    somePage="some_path_to_page"
    .../>
...

合适的 HTL 组件some-component.html

<div data-sly-use.some_model="org.example.SomeModel">
    ...    
</div>

和模型类SomeModel.java

package org.example;
...
import com.day.cq.wcm.api.Page;
...

@Model(adaptables = { SlingHttpServletRequest.class, Resource.class },
    defaultInjectionStrategy = DefaultInjectionStrategy.REQUIRED)
public class RelatedContentBlock {

    @ValueMapValue
    private Page somePage;

    ...
}

我可以使用@Inject@Via注释轻松获取所需的Page 对象,但是为什么我不能使用@ValueMapValue注释来获取它呢?我尝试使用所有可能的变体,包括通过属性等。是的,我可以从pageManager获得它,但是@ValueMapValue有什么问题?

提前致谢!

4

1 回答 1

5

您链接的@ValueMapValue注释文档具有您正在寻找的答案:

用于方法、字段或构造函数参数的注释,以让 Sling 模型从当前资源的 ValueMap 中注入一个值。

重要的部分是:

从 ValueMap 注入一个值

APage不是ValueMap. 因此,该注解不能用于注入页面。

该注解主要用于注入页面属性。因为页面属性(或相关的资源属性)存储在ValueMap. 这就是为什么您可以使用@ValueMapValue注解来注入jcr:title页面的原因:

@ValueMapValue(name = "jcr:title")
private String title;

这相当于(伪代码):

final ValueMap pageProperites = Page.getProperties();
final String title = pageProperties.get("jcr:title", "" /* default */);
于 2017-05-20T11:13:49.950 回答