使用Struts2

时间:2015-06-09 12:45:06

标签: java hibernate struts2

考虑以下因素:

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,问题就解决了。

1 个答案:

答案 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>

如果内部迭代不起作用,可能有些东西没有显示给我们,或者与您在发布代码之前清理代码的方式有关。