我在一个项目中使用 BetterBeanBindings,如果我可以对键不是字符串的 Map 进行绑定,那就太好了。
让我们举个例子来说明这种情况:
public class Bean {
// ...
private Map<String, AnotherObject> mapOne;
private Map<SomeObject, AnotherObject> mapTwo;
// ...
public Map<String, AnotherObject> getMapOne() {
return this.mapOne;
}
public void setMapOne(Map<String, AnotherObject> mapOne) {
Map<String, AnotherObject> oldMapOne = this.mapOne;
this.mapOne = mapOne;
this.propertyChangeSupport.firePropertyChange("mapOne", oldMapOne, mapOne);
}
public Map<SomeObject, AnotherObject> getMapTwo() {
return this.mapTwo;
}
public void setMapTwo(Map<SomeObject, AnotherObject> mapTwo) {
Map<SomeObject, AnotherObject> oldMapTwo = this.mapTwo;
this.mapTwo = mapTwo;
this.propertyChangeSupport.firePropertyChange("mapTwo", oldMapTwo, mapTwo);
}
// ...
}
BBB 能够对键为 String 的映射进行绑定(如果我没记错的话,也可以对数字进行绑定,甚至没有原始类型,它们具有标准解析)允许这样做:
Bean bean;
// ...
Bindings.createAutoBinding(UpdateStrategy.READ_WRITE
bean, BeanProperty.create("mapOne.xxx"),
whateverBean, whateverProperty);
这将正确地将结果绑定bean.getMapOne().get("xxx")
到第 5 个和第 4 个参数中给定对象的给定属性,反之亦然。
但是,如果我们尝试相同的mapTwo
Bindings.createAutoBinding(UpdateStrategy.READ_WRITE
bean, BeanProperty.create("mapTwo.xxx"),
whateverOtherOrNotBean, whateverOtherOrNotProperty);
绑定尝试解析bean.getMapTwo().get("xxx")
,因为这是属性定义中提供的内容,mapTwo
可能不是String
, 返回null
. 这是有道理的,因为绑定不必知道如何将其String
从属性转换为解析所需的对象
有没有办法做到这一点?使用转换器可能有某种解决方法?