如何转换List,其元素的类类型在Struts 2中不明确

时间:2013-04-16 15:24:00

标签: java java-ee struts2 converter

有没有人知道如何在不使用任何自定义转换器的情况下处理Struts 2中的这种情况。

我的模型定义

1。Booking

public class Booking extends BaseModel{
    private String bookingNo;
    .....
    private List<Part>parts = new ArrayList<Part>();
    private List <? extends ToDoItem>toDoItems = new ArrayList< ToDoItem>();
    ....
}

2。ToDoItem

public class ToDoItem extends BaseModel{
    private Integer sequence;
    private String bookingNo;
    private String serviceCode;...

3.从ToDoItem继承的指定todoitem 例如PDAS

   public class PDAS extends ToDoItem{
      private Date estPickupTime;
      private Date actPickupTime;
      private Date estArriAtWarehouseTime;
      private Date actArriAtWarehouseTime;...

INSP:

public class INSP extends ToDoItem{
    private String confirmOk;
    private Date actInspTime;
    private List<BookingItem>bookingItems;.....

...(更多指定的ToDoItem)

然后在html页面中,表单定义如下:

PDAS todoitem html

<table class="form-table">

  <tr class="row">

    <td class="td-label" colspan="2">

      <s:label key="INSP" cssStyle="color:blue;"/>

    </td>

    <td class="td-label">

      <s:label key="ToDoItem.status"/>

    </td>

    <td class="td-field">

      <s:property value="booking.toDoItems[1].status"></s:property>

    </td>

    <td class="td-field" colspan="2">

      <s:select list="{'PENDING','COMPLETED','EXCEPTION','CANCELLED'}" labelposition="top"/>

    </td>

  </tr>

INSP todoitem html

  <tr>
    <td class="td-label">

      <s:label key="ToDoItem.assignedBy"/>

    </td>

    <td class="td-field">

      <s:textfield name="booking.toDoItems[1].assignedBy" cssStyle="width:88%;" value="%{#session.user.userName}"
                   readonly="true" cssClass="readonly"></s:textfield>

    </td>

    <td class="td-label">

      <s:label key="ToDoItem.assignedTo"/>

    </td>


    <td class="td-field">


      <s:textfield name="booking.toDoItems[1].assignedTo" cssStyle="width:88%;" value="%{#session.user.userName}"
                   readonly="true" cssClass="readonly"></s:textfield>


    </td>

我知道我在这里粘贴的代码有点质量,但请耐心等待,我的问题是当我进入todoitem的字段时,例如PDAS,INSP的字段,然后提交表单,todoitem得到的保存操作为空,例如,当我循环todoitems并在保存操作中打印它时,它得到以下日志:

22:23:04,923  INFO BookingAction:100 - Start save booking with 
booking:com.chailie.booking.model.booking.Booking@726dad0
22:23:04,925 DEBUG BookingAction:104 - The todoitem is [null]
22:23:04,926 DEBUG BookingAction:104 - The todoitem is [null]
22:23:04,927 DEBUG BookingAction:104 - The todoitem is [null]
22:23:04,928 DEBUG BookingAction:104 - The todoitem is [null]

我知道这是因为Action转换指定的todoitem失败了,但是有人能告诉我如何解决它吗?我知道也许我可以写一个自定义转换器来转换List todoitems,但我不喜欢自定义转换器,那么有没有其他方法让struts帮我转换这些指定的ToDoItems?

1 个答案:

答案 0 :(得分:0)

我的问题已经解决了,我刚刚定义了一个拦截器来实例化 使用PDAS,INSP等列出toDoItems,然后将其设置为valuestack。因为我已经实例化到DoItem,struts只会直接使用这个现有的toDoItems而不再创建它,然后问题就解决了