无法使用Java Use API和Sightly(Htl)获取对象列表

无法使用Java Use API和Sightly(Htl)获取对象列表,java,aem,sightly,Java,Aem,Sightly,我正在尝试使用sighly将link List类型的自定义对象列表转换成html。但我无法用肉眼看出来。示例代码粘贴在下面: Javabean: public class MiniNavBean { private String fPath; private String activeAttr; public MiniNavBean(String fPath, String activeAttr){ this.fPath = fPath;

我正在尝试使用sighly将link List类型的自定义对象列表转换成html。但我无法用肉眼看出来。示例代码粘贴在下面:

Javabean:

public class MiniNavBean {

    private String fPath;

    private String activeAttr;

    public MiniNavBean(String fPath, String activeAttr){
        this.fPath = fPath;
        this.activeAttr = activeAttr;
    }

    public String getFpath() {
        return fPath;
    }

    public void setFpath(String fpath) {
        this.fPath = fpath;
    }

    public String getActiveattr() {
        return activeAttr;
    }

    public void setActiveattr(String activeattr) {
        this.activeAttr = activeattr;
    }

}
public class MiniNav extends WCMUsePojo {

    private List<MiniNavBean> navList;

    MiniNavBean miniNav;

    public List<MiniNavBean> getNavList() {
        return navList;
    }

    public void setNavList(List<MiniNavBean> navList) {
        this.navList = navList;
    }

    @Override
    public void activate() {
        navList = new LinkedList<MiniNavBean>();
        fPath = "fpaths";
        activeAttr = "activeattrs;"       
        miniNav = new MiniNavBean(fpath, activeattr);
        navList.add(miniNav);
    }
}
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
   <li>
    <p>${navlist.fPath}</p>
    <p>${navlist.activeAttr}</p>
   </li>
</div>
扩展WCMUsePojo的Java类:

public class MiniNavBean {

    private String fPath;

    private String activeAttr;

    public MiniNavBean(String fPath, String activeAttr){
        this.fPath = fPath;
        this.activeAttr = activeAttr;
    }

    public String getFpath() {
        return fPath;
    }

    public void setFpath(String fpath) {
        this.fPath = fpath;
    }

    public String getActiveattr() {
        return activeAttr;
    }

    public void setActiveattr(String activeattr) {
        this.activeAttr = activeattr;
    }

}
public class MiniNav extends WCMUsePojo {

    private List<MiniNavBean> navList;

    MiniNavBean miniNav;

    public List<MiniNavBean> getNavList() {
        return navList;
    }

    public void setNavList(List<MiniNavBean> navList) {
        this.navList = navList;
    }

    @Override
    public void activate() {
        navList = new LinkedList<MiniNavBean>();
        fPath = "fpaths";
        activeAttr = "activeattrs;"       
        miniNav = new MiniNavBean(fpath, activeattr);
        navList.add(miniNav);
    }
}
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
   <li>
    <p>${navlist.fPath}</p>
    <p>${navlist.activeAttr}</p>
   </li>
</div>
公共类MiniNav扩展了WCMUsePojo{
私人名单;
迷你导航豆迷你导航;
公共列表getNavList(){
返回导航列表;
}
公共作废设置导航列表(列表导航列表){
this.navList=navList;
}
@凌驾
公开作废激活(){
navList=newlinkedlist();
fPath=“fpaths”;
activeAttr=“activeattrs;”
miniNav=新的MiniNavBean(fpath,activeattr);
导航列表。添加(迷你导航);
}
}
Html文件(很明显):

public class MiniNavBean {

    private String fPath;

    private String activeAttr;

    public MiniNavBean(String fPath, String activeAttr){
        this.fPath = fPath;
        this.activeAttr = activeAttr;
    }

    public String getFpath() {
        return fPath;
    }

    public void setFpath(String fpath) {
        this.fPath = fpath;
    }

    public String getActiveattr() {
        return activeAttr;
    }

    public void setActiveattr(String activeattr) {
        this.activeAttr = activeattr;
    }

}
public class MiniNav extends WCMUsePojo {

    private List<MiniNavBean> navList;

    MiniNavBean miniNav;

    public List<MiniNavBean> getNavList() {
        return navList;
    }

    public void setNavList(List<MiniNavBean> navList) {
        this.navList = navList;
    }

    @Override
    public void activate() {
        navList = new LinkedList<MiniNavBean>();
        fPath = "fpaths";
        activeAttr = "activeattrs;"       
        miniNav = new MiniNavBean(fpath, activeattr);
        navList.add(miniNav);
    }
}
<div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
   <li>
    <p>${navlist.fPath}</p>
    <p>${navlist.activeAttr}</p>
   </li>
</div>

  • ${navlist.fPath}

    ${navlist.activeAttr}

  • 当我试图执行上述代码时,我能够看到链表被java类中的数据实例化。但是,当我试图在前端显示列表的值时,sightly无法读取它


    由于LinkedList是CustomObject类型(MiniNavBean),我怀疑它无法读取它,因为它不知道这个bean,因为我们没有在任何地方引用该bean。有没有办法使用sightly标记和读取数据来解决此问题?

    在您的示例中,您既没有为
    MiniNav
    navList
    成员赋值,也没有向其添加
    MiniNavBean
    实例

    将以下行添加到
    activate()
    方法中:

    this.navList = new LinkedList<>();
    this.navList.add(navList);
    
    this.navList=newlinkedlist();
    this.navList.add(navList);
    
    另外,Java getter和HTL/Sightly访问器没有正确对齐,即:对于
    getFpath()
    您应该使用
    navlist.fpath

    如果您已经有了这些错误,您是否从HTL/Sightly获得了任何编译或运行时错误


    HTL/Sightly通常使用反射来查找对象的属性,因此它不太关心对象的类型。

    在您的示例中,您既没有为
    MiniNav
    navList
    成员赋值,也没有向其添加
    MiniNavBean
    实例

    将以下行添加到
    activate()
    方法中:

    this.navList = new LinkedList<>();
    this.navList.add(navList);
    
    this.navList=newlinkedlist();
    this.navList.add(navList);
    
    另外,Java getter和HTL/Sightly访问器没有正确对齐,即:对于
    getFpath()
    您应该使用
    navlist.fpath

    如果您已经有了这些错误,您是否从HTL/Sightly获得了任何编译或运行时错误


    HTL/Sightly通常使用反射来查找对象的属性,因此它不太关心对象的类型。

    Sightly也会在Java对象上循环。我不认为这有什么问题。看来你的getter是错的。如下所示更改bean

    public class MiniNavBean {
    
        private String fPath;
    
        private String activeAttr;
    
        public MiniNavBean(String fPath, String activeAttr){
            this.fPath = fPath;
            this.activeAttr = activeAttr;
        }
    
        public String getfPath() {
            return fPath;
        }
    
        public void setfPath(String fPath) {
            this.fPath = fPath;
        }
    
        public String getActiveAttr() {
            return activeAttr;
        }
    
        public void setActiveAttr(String activeAttr) {
            this.activeAttr = activeAttr;
        }
    }
    
    如果不希望更改bean,那么可以直接访问Sightly文件中的getter,并检查它是否工作正常

    <div data-sly-include="/apps/project/components/global.jsp"></div>
    <div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
    <div data-sly-list.navlist="${mininav.navList}">
       <li>
        <p>${navlist.getFpath}</p>
        <p>${navlist.getActiveattr}</p>
       </li>
    </div>
    
    
    
  • ${navlist.getFpath}

    ${navlist.getActiveattr}

  • 编辑:根据评论解释更多内容

    不能访问类外的私有字段,这些字段通常使用公共getter方法完成。然而,很明显,当您在点运算符之后使用字段名时,您并不是直接访问字段,而是根据命名getter/setter的Java规范调用相应的getter方法。因此,根据规范,您的getter和setter在bean中是错误的,这是因为它不起作用


    正如我上面提到的,您只能更改bean,并且代码可以正常工作。或者,您可以让bean保持原样,并更改Sightly代码以使其正常工作。

    Sightly也可以在Java对象上循环。我不认为这有什么问题。看来你的getter是错的。如下所示更改bean

    public class MiniNavBean {
    
        private String fPath;
    
        private String activeAttr;
    
        public MiniNavBean(String fPath, String activeAttr){
            this.fPath = fPath;
            this.activeAttr = activeAttr;
        }
    
        public String getfPath() {
            return fPath;
        }
    
        public void setfPath(String fPath) {
            this.fPath = fPath;
        }
    
        public String getActiveAttr() {
            return activeAttr;
        }
    
        public void setActiveAttr(String activeAttr) {
            this.activeAttr = activeAttr;
        }
    }
    
    如果不希望更改bean,那么可以直接访问Sightly文件中的getter,并检查它是否工作正常

    <div data-sly-include="/apps/project/components/global.jsp"></div>
    <div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
    <div data-sly-list.navlist="${mininav.navList}">
       <li>
        <p>${navlist.getFpath}</p>
        <p>${navlist.getActiveattr}</p>
       </li>
    </div>
    
    
    
  • ${navlist.getFpath}

    ${navlist.getActiveattr}

  • 编辑:根据评论解释更多内容

    不能访问类外的私有字段,这些字段通常使用公共getter方法完成。然而,很明显,当您在点运算符之后使用字段名时,您并不是直接访问字段,而是根据命名getter/setter的Java规范调用相应的getter方法。因此,根据规范,您的getter和setter在bean中是错误的,这是因为它不起作用


    正如我上面提到的,您只能更改bean,并且代码可以正常工作。或者,您可以让bean保持原样,并更改代码以使其正常工作。

    很抱歉,这是一个复制粘贴错误。我的代码中已经有了这些更改。但是,它不会读取存储在链接列表中的自定义对象的值。如果链表的类型为String,则可以读取值,即new LinkedList()。我在列表中没有看到任何控制台错误或错误日志backend@RRN
    li
    元素是否至少得到渲染?我刚刚注意到您的getter/属性之间没有正确对齐,即:对于
    getFpath()
    您应该使用
    navlist.fpath
    很抱歉,这是一个复制粘贴错误。我的代码中已经有了这些更改。但是,它不会读取存储在链接列表中的自定义对象的值。如果链表的类型为String,则可以读取值,即new LinkedList()。我在列表中没有看到任何控制台错误或错误日志backend@RRN
    li
    元素是否至少得到渲染?我刚刚注意到您的getter/属性没有正确地相互对齐,例如:for