考虑以下因素:
public class Company {
private String name;
private List<Person> employees;
//getters and setters
}
public class Person {
private String name;
private List<Car> cars;
//getters and setters
}
public class Car {
private String color;
//getter and setter
}
我希望Struts2为每位员工提供每辆车的颜色属性。那么我如何迭代公司对象的每个员工的汽车列表呢?
创建后,我将员工作为 employeeList 放入会话中。使用以下方法,我只能获取名称属性,但不能遍历汽车属性:
<s:if test="#session.employeeList.size() > 0">
<s:iterator value="#session.employeeList">
<s:property value="name" /> //this works
<s:property value="cars" /> //how do I iterate over this list?
</s:iterator>
</s:if>
这样做,&#34;汽车&#34;的输出属性为ognl.NoConversionPossible
我尝试过类似的事情:
<s:if test="#session.employeeList.size() > 0">
<s:iterator value="#session.employeeList">
<s:property value="name" /> //this works
<s:iterator value="cars">
<s:property value="color" />
</s:iterator>
</s:iterator>
</s:if>
但不会这样做。有什么想法吗?
LE:解决方案:实际上迭代是有效的。我所谈论的对象被映射为Hibernate实体。 &#34;列出汽车&#34;财产实际上是@ManyToMany
关系。因此,在深入查看错误日志后,我发现我试图迭代的汽车属性没有被填充,因为Hibernate默认是懒惰地初始化它。我将FetchType
更改为EAGER
,问题就解决了。
答案 0 :(得分:3)
我在动作属性上使用会话的事实并不重要。虽然,在这种情况下如何使用动作属性?它似乎并不可行。
为什么不呢?
<强>动作强>:
public class MyAction extends ActionSupport {
private Company company; // private attribute
public Company getCompany(){ // public getter
return company;
}
public String execute(){
company = someService.loadTheCompanySomehow();
return SUCCESS;
}
}
<强> JSP 强>:
<s:iterator value="company.employees">
<s:property value="name" />
<s:iterator value="cars">
<s:property value="color" />
</s:iterator>
</s:iterator>
如果内部迭代不起作用,可能有些东西没有显示给我们,或者与您在发布代码之前清理代码的方式有关。