正如我在邮件主题中提到的那样,BasicDynaBean内部的映射不可变存在问题。
据我所知,这是此地图的默认行为。
我想做的是,只需从db检索结果集,这将创建一个包含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


我认为,这是因为dyna bean中的地图不可变。
我认为一种选择是通过编辑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);
    }

关于java - 可变的BasicDynaBean映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30988804/

10-13 04:30