【发布时间】: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