Java 可变基达尼映射

Java 可变基达尼映射,java,Java,正如我在邮件主题中提到的,我在BasicDynaBean中遇到了不可变映射的问题。 据我所知,这是此地图的默认行为。 我想做的是,只需从db中检索resultset,它将创建一个包含DynaBeans的列表。 对于查看数据库表,一切正常,当我尝试编辑它时出现问题,出现以下异常: Caused by: javax.el.PropertyNotWritableException at javax.el.MapELResolver.setValue(MapELResolver.java:267

正如我在邮件主题中提到的,我在BasicDynaBean中遇到了不可变映射的问题。 据我所知,这是此地图的默认行为。 我想做的是,只需从db中检索resultset,它将创建一个包含DynaBeans的列表。 对于查看数据库表,一切正常,当我尝试编辑它时出现问题,出现以下异常:

Caused by: javax.el.PropertyNotWritableException
    at javax.el.MapELResolver.setValue(MapELResolver.java:267)
    at com.sun.faces.el.DemuxCompositeELResolver._setValue(DemuxCompositeELResolver.java:255)
    at com.sun.faces.el.DemuxCompositeELResolver.setValue(DemuxCompositeELResolver.java:281)
    at com.sun.el.parser.AstValue.setValue(AstValue.java:201)
    at com.sun.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:291)
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
    ... 50 more
我假设,这是因为dynabean中的映射是不可变的。 我认为一种选择是通过编辑BeanUtils库的源代码来更改地图的默认行为。 另一方面,我认为这个库的实现者一定以某种方式想到了这个功能。。。 下面是我用来检索作为DynaBeans的结果集的代码片段

    String query = "SELECT * FROM test.a";

    Statement stmt = (Statement) con.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    RowSetDynaClass rsdc = new RowSetDynaClass(rs);

    rs.close();
    stmt.close();
    dynaObjectList= rsdc.getRows();
我也试着使用LazyDynaMap,编辑表格效果很好,但是 Map不允许我放置多个数据,因为该键对于其他数据集不是唯一的。 因为键是属性名

如果你能给我一些提示,我将不胜感激。 提前谢谢。 如果可能的话,我真的很期待看到答案。 顺致敬意,
默认情况下,BasicDynaBean具有DynaBeans的可变映射。我创建了另一个LazyDynaMap不可变的地图,并解决了这个问题。希望这对其他人有帮助

setDecoratedDynaObjectList(rsdc.getRows());
    Iterator<DynaBean> it=decoratedDynaObjectList.iterator();
    while(it.hasNext()){
        BasicDynaBean dynaBean = (BasicDynaBean) it.next();
        Map<String,Object> modifiableMap=new DynaBeanPropertyMapDecorator(dynaBean, false);
        DynaBean mutableDynaBean=new LazyDynaMap(modifiableMap);
        modifiableDynaObjectList.add(mutableDynaBean);
    }
setDecoratedDynaObjectList(rsdc.getRows());
迭代器it=decoratedDynaObjectList.Iterator();
while(it.hasNext()){
BasicDynaBean=(BasicDynaBean)it.next();
Map modifiableMap=新的DynaBeanPropertyMapDecorator(dynaBean,false);
DynaBean可变DynaBean=新LazyDynaMap(modifiableMap);
modifiableDynaObjectList.add(mutableDynaBean);
}

默认情况下,BasicDynaBean具有DynaBeans的可变映射。我创建了另一个LazyDynaMap不可变的地图,并解决了这个问题。希望这对其他人有帮助

setDecoratedDynaObjectList(rsdc.getRows());
    Iterator<DynaBean> it=decoratedDynaObjectList.iterator();
    while(it.hasNext()){
        BasicDynaBean dynaBean = (BasicDynaBean) it.next();
        Map<String,Object> modifiableMap=new DynaBeanPropertyMapDecorator(dynaBean, false);
        DynaBean mutableDynaBean=new LazyDynaMap(modifiableMap);
        modifiableDynaObjectList.add(mutableDynaBean);
    }
setDecoratedDynaObjectList(rsdc.getRows());
迭代器it=decoratedDynaObjectList.Iterator();
while(it.hasNext()){
BasicDynaBean=(BasicDynaBean)it.next();
Map modifiableMap=新的DynaBeanPropertyMapDecorator(dynaBean,false);
DynaBean可变DynaBean=新LazyDynaMap(modifiableMap);
modifiableDynaObjectList.add(mutableDynaBean);
}