【问题标题】:How to convert a List that its element's class type is not clear in Struts 2 [duplicate]如何在Struts 2中转换其元素的类类型不清楚的List [重复]
【发布时间】:2013-04-16 15:24:00
【问题描述】:

有谁知道如何在不使用任何自定义转换器的情况下在 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 例如掌上电脑

   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为空,例如,当我循环待办事项并在保存操作中打印时,它得到以下日志:

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]

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

【问题讨论】:

  • ... 如果没有自定义转换器,你怎么能做到呢?除非你告诉它,否则怎么会知道将项目转换为什么子类型?
  • 如果他只有两个子类型,为每个子类型创建一个动作是合理的......他也可以按照这里的配方动态设置一个合适的模型(如果有很多潜在的模型类很有用): stackoverflow.com/questions/15712347/…
  • 你好,如果我在我的情况下添加一个自定义转换器,有什么特别之处吗?我昨天尝试添加一个全局自定义转换器,但它不起作用,struts 仍将使用 OGNL 表达式自己设置属性,它不会调用我的自定义转换器,我的 xwork-conversion.properties 如下:com.chailie.booking.model.booking.Booking=com.chailie.booking.control.help.BookingConverter,配置有问题吗?

标签: java jakarta-ee struts2 converter


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2021-06-04
    • 2021-05-08
    • 2019-01-13
    相关资源
    最近更新 更多