【问题标题】:Unable to adapt model class into SlingHttpServletRequest无法将模型类适配到 SlingHttpServletRequest
【发布时间】:2018-09-28 08:30:52
【问题描述】:

我正在尝试在我的模型类中注入资源。我使用注解@Model(adaptables = { SlingHttpServletRequest.class, Resource.class })时遇到的问题

我得到的对象为空,而只有 Resource.Class 我得到的对象(navigationItems)。下面是我班的sn-p。你能告诉我修复它的步骤吗?

import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.List;

@Model(adaptables =  { SlingHttpServletRequest.class, Resource.class })
public class Header {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Inject
    @Optional
    @Named("navitems")
    private Resource navigationItems;

    List<SiteNavigation> siteNavigationList;

    @PostConstruct
    protected void init() {
        logger.info("In init method of header model.");
        siteNavigationList = getSiteNavigationListItems(getNavigationItems());
    }

    private List<SiteNavigation> getSiteNavigationListItems(final Resource navigationItems, final Resource columnFourItems) {
        return null;
    }

    public Resource getNavigationItems() {
        return navigationItems;
    }
}

如果我删除可选注释,我会收到以下错误:

28.09.2018 14:04:39.735 *ERROR* [0:0:0:0:0:0:0:1 [1538123679033] GET /conf/myprj/settings/wcm/templates/homepage/structure.html HTTP/1.1] com.day.cq.wcm.core.impl.WCMDeveloperModeFilter Error during include of SlingRequestPathInfo: path='/conf/myprj/settings/wcm/templates/homepage/structure/jcr:content/root/header', selectorString='null', extension='html', suffix='null'
org.apache.sling.api.SlingException: Cannot get DefaultSlingScript: Identifier com.myprj.core.models.Header cannot be correctly instantiated by the Use API
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.service(DefaultSlingScript.java:510) [org.apache.sling.scripting.core:2.0.54]
    at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:552) [org.apache.sling.engine:2.6.12]

    Caused by: org.apache.sling.models.factory.MissingElementsException: Could not inject all required fields into class com.myprj.core.models.Header
    at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:679) [org.apache.sling.models.impl:1.4.7.T20180205124646-b0647a3]
    at org.apache.sling.models.impl.ModelAdapterFactory.internalCreateModel(ModelAdapterFactory.java:394) [org.apache.sling.models.impl:1.4.7.T20180205124646-b0647a3]
    at org.apache.sling.models.impl.ModelAdapterFactory.createModel(ModelAdapterFactory.java:261) [org.apache.sling.models.impl:1.4.7.T20180205124646-b0647a3]
    at org.apache.sling.scripting.sightly.models.impl.SlingModelsUseProvider.provide(SlingModelsUseProvider.java:126) [org.apache.sling.scripting.sightly.models.provider:1.0.6]
    at org.apache.sling.scripting.sightly.impl.engine.extension.use.UseRuntimeExtension.call(UseRuntimeExtension.java:73) [org.apache.sling.scripting.sightly:1.0.48.1_3_1]
    ... 243 common frames omitted
    Suppressed: org.apache.sling.models.factory.MissingElementException: Could not inject private org.apache.sling.api.resource.Resource com.myprj.core.models.Header.navigationItems
        at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:684) [org.apache.sling.models.impl:1.4.7.T20180205124646-b0647a3]
        ... 247 common frames omitted
    Caused by: org.apache.sling.models.factory.ModelClassException: No injector returned a non-null value!
        at org.apache.sling.models.impl.ModelAdapterFactory.injectElement(ModelAdapterFactory.java:581) [org.apache.sling.models.impl:1.4.7.T20180205124646-b0647a3]
        at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:682) [org.apache.sling.models.impl:1.4.7.T20180205124646-b0647a3]
        ... 247 common frames omitted

【问题讨论】:

  • request.getResource() 是否提供了错误的资源?
  • 在代码中添加了@Inject SlingHttpServletRequest request;request.getResource() 为我提供了作为标题的正确节点的路径。 /conf/myprj/settings/wcm/templates/homepage/structure/jcr:content/root/header

标签: aem sling-models


【解决方案1】:

代码中的 3 个指针:

  1. 虽然sling9支持多种适配,但最好adapt fromSlingHttpServetlRequest对象。它位于较高层并包裹大多数其他对象。
  2. 建议使您的注射器比通用@Inject 更多specific
  3. 始终指定resourceType attribute 以将您的模型与特定资源类型相关联。适合片段的导出器,吊索可以关联更紧密和更好的可读性。

这将是我为您的吊索模型编写的代码:

@Model(adaptables = SlingHttpServletRequest.class, resourceType = "myprj/components/content/header",
  defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class Header {

  @ChildResource
  private Resource navitems; // Keeping resource name and attribute name identical reduces @Named annotation

【讨论】:

    【解决方案2】:

    使用@Via 注释解决了这个问题。下面是我用的sn-p。

    @Inject
        @Via("resource")
        @Named("navitems")
        private Resource navigationItems;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 2018-04-10
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多