2017-10-01 12 views
0

산호 UI 3 다중 영역을 만들고 슬링 모델을 사용하려고합니다. enter image description hereAEM 6.3 - 슬링 모델을 사용하는 멀티 필드

다음

enter image description here

코드입니다 : 다음은 대화 상자처럼 보이는 방법이다

package com.aem.sites.models; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.inject.Inject; 
import javax.inject.Named; 

import org.apache.sling.api.resource.Resource; 
import org.apache.sling.models.annotations.Model; 

import org.apache.log4j.Logger; 

import com.aem.sites.models.Header; 

@Model(adaptables=Resource.class) 
public class HeaderList { 

    final static Logger logger = Logger.getLogger(HeaderList.class); 

    @Inject 
    @Named("header") 
    public Resource headerList; 

    public List<Header> links; 

    @PostConstruct 
    protected void init() { 
     links = new ArrayList<Header>(); 
     if(headerList != null) { 
      logger.info("value of header list is "+headerList); 
      links = populateModel(links, headerList); 
     } 
    } 

    public List<Header> populateModel(List<Header> array, Resource resource) { 
     if(resource != null) { 
      Iterator<Resource> linkResource = resource.listChildren(); 
      while(linkResource.hasNext()) { 
       Header header = linkResource.next().adaptTo(Header.class); 
       if(header != null) { 
        array.add(header); 
       } 
      } 
     } 
     return array; 
    } 

    public List<Header> getLinks() { 
     return links; 
    } 

} 


    package com.aem.sites.models; 

import javax.annotation.PostConstruct; 
import javax.inject.Inject; 
import javax.inject.Named; 

import org.apache.sling.api.resource.Resource; 
import org.apache.sling.models.annotations.Model; 

//Creating adaptable resource class using sling annotation 
@Model(adaptables = Resource.class) 
public class Header { 

    @Inject 
    @Named("linkText") 
    private String linkText; 

    @Inject 
    @Named("linkUrl") 
    private String linkUrl; 

    @PostConstruct 
    protected void init() { 

    } 

    public String getTitle() { 
     return linkText; 
    } 

    public String getUrl() { 
     return linkUrl; 
    } 

    public void setTitle(String title) { 
     linkText = title; 
    } 

    public void setUrl(String url) { 
     linkUrl = url; 
    } 
} 

여기에 HTL 파일입니다

<header id="header" class="skel-layers-fixed"> 
<nav id="nav"> 
<h1><a href="#">Ion</a></h1> 
<sly data-sly-use.headerObj="com.aem.sites.models.HeaderList"> 
<ul data-sly-list="${headerObj.items.listChildren}"> 
<li><a href="${item.linkUrl @context='styleToken'}">${item.linkText @context='styleToken'}</a></li> 
</ul> 
</sly> 
</nav> 
</header> 

여기에 오류가 나는 다음과 같이 대답했다 :

Caused by: org.apache.sling.models.factory.MissingElementsException: Could not inject all required fields into class com.aem.sites.models.HeaderList 
    at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:593) 
    at org.apache.sling.models.impl.ModelAdapterFactory.internalCreateModel(ModelAdapterFactory.java:335) 
    at org.apache.sling.models.impl.ModelAdapterFactory.createModel(ModelAdapterFactory.java:223) 
    at org.apache.sling.scripting.sightly.models.impl.SlingModelsUseProvider.provide(SlingModelsUseProvider.java:135) 
    at org.apache.sling.scripting.sightly.impl.engine.extension.use.UseRuntimeExtension.call(UseRuntimeExtension.java:72) 
    ... 209 common frames omitted 
    Suppressed: org.apache.sling.models.factory.MissingElementException: Could not inject public org.apache.sling.api.resource.Resource com.aem.sites.models.HeaderList.headerList 
     at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:598) 
     ... 213 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:513) 
     at org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:596) 

여기 내가 잘못하고 있는지 확실하지 않습니다. 대화와 관련이 있는지 확실하지 않습니다. 그것이 내가 의심하는 바입니다.

도움을 주시면 감사하겠습니다.

미리 감사드립니다.

답변

1

모델의 headerList 특성을 성공적으로 주입 할 수 없으므로 오류가 발생합니다. items 노드를 가져 와서 하위 노드를 나열 할 수 있어야합니다. 아마도 다음을 시도해보십시오 :

<sly data-sly-use.headerObj="com.aem.sites.models.HeaderList"> 
    <ul data-sly-list="${headerObj.links}"> 
    <li><a href="${item.linkUrl @context='styleToken'}">${item.linkText @context='styleToken'}</a> 
    </li> 
    </ul> 
</sly> 
+0

고마워 :

@Model(adaptables=Resource.class) public class HeaderList { final static Logger logger = Logger.getLogger(HeaderList.class); @Inject @Named("items") <--------- changed this public Resource headerList; public List<Header> links; @PostConstruct protected void init() { links = new ArrayList<Header>(); if(headerList != null) { logger.info("value of header list is "+headerList); links = populateModel(links, headerList); } } public List<Header> populateModel(List<Header> array, Resource resource) { if(resource != null) { Iterator<Resource> linkResource = resource.listChildren(); while(linkResource.hasNext()) { Header header = linkResource.next().adaptTo(Header.class); if(header != null) { array.add(header); } } } return array; } public List<Header> getLinks() { return links; } } 

및 템플릿에

이 바로 links 속성을 사용합니다. 다른 접근법을 시도했지만 이것은 결국 효과가있었습니다. – user972418