使用动态实体属性循环textfield组件

时间:2013-09-17 19:06:28

标签: java reflection tapestry

我是一个Tapestry5用户,我有一个表格,里面有很多字段,都是用数字递增的。

例如

timesheet.tsHours01 timesheet.tsHours02 等

我想动态循环,但未能完全使其正常工作。到目前为止我尝试过的。

     

@Property
private List<TimeSheetEntity> timeSheetEntity;

@Property
private List<TsWhour> tsWhours;

@Property
private TsWhour tsWhour;

public void onPrepareFromForm() {
    this.timeSheetEntity = timeSheetService.getCreateOrUpdate(timeSheetEntity);

    tsWhours = new ArrayList<TsWhour>();
    tsWhours.add(new TsWhour(timeSheetEntity, "TsWhours01"));
    tsWhours.add(new TsWhour(timeSheetEntity, "TsWhours02"));
    tsWhours.add(new TsWhour(timeSheetEntity, "TsWhours03"));
}

public class TsWhour {

    private TimeSheetEntity timeSheetEntity;
    private String id;

    private BigDecimal property;

    public TsWhour() {
    }

    public TsWhour(TimeSheetEntity timeSheetEntity, String id) {
        this.timeSheetEntity = timeSheetEntity;
        this.id = id;
    }

    public BigDecimal getProperty() {
        try {
            Method method = TimeSheetEntity.class.getMethod("get" + id);                 
            return (BigDecimal) method.invoke(timeSheetEntity);
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(TimeSheet.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;           
    }

    public void setProperty(BigDecimal value) {
        System.out.println(value);
    }

    public TimeSheetEntity getTimeSheetEntity() {
        return timeSheetEntity;
    }

    public void setTimeSheetEntity(TimeSheetEntity timeSheetEntity) {
        this.timeSheetEntity = timeSheetEntity;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

我能够加载页面,但是当我保存它时失败了。如果可能的话,我宁愿不将数据类型指定为bigdecimal以使其保持完全动态。

2 个答案:

答案 0 :(得分:1)

首先,您可以使用PropertyAccess服务作为获取动态计算属性的更简单方法。

什么是设置和更改ID? TsWhour是一个组成部分吗?

基本上,在表单提交时,Tapestry需要将其步骤回溯到每个组件以及该id属性的每次更改。 Form中的Loop组件知道如何执行此操作(尽管您可以对其进行配置以稍微优化一些事情)。

您没有提供足够的背景信息。

最后,如果您拥有“无数”几乎相同的字段,那么您的数据建模可能存在问题。也许你需要的东西看起来更像是地图而不是对象。也许您需要一种简单的方法从实体类型中提取数据(我假设您正在使用Hibernate或JPA)到一个更容易在UI层中使用的中间类型。

答案 1 :(得分:0)

如果像霍华德建议的那样,你想使用java.util.Map作为中间对象,你可以使用tapestry-stitch的map:绑定前缀。演示here