我正在开发可以对通过Hibernate返回的具体数据bean进行操作的功能,或者使用Jakarta Commons / BeanUtils的RowSetDynaClass(包装JDBC结果集)返回的DynaBeans。默认情况下,RowSetDynaClass强制所有bean属性名称为小写,我需要使用WrapDynaBean将我的所有具体bean从Hibernate转换为DynaBeans。 RowSetDynaClass的默认下限似乎是一个好主意,但是我可能不知道具体bean的属性名称将如何被提示;由于Hibernate配置,它们不需要与它们对应的表列名相同。
是否内置了使用BeanUtils强制属性名称小写的功能?除了RowSetDynaClass之外,我找不到它的文档。代替BeanUtils内置的东西,任何人都可以建议自己实现这一目标的最好方法吗?
答案 0 :(得分:1)
我不知道这样做的简单方法。 Potentialy你可以自己实现Resolver接口。
但我会建议使用其他转换框架,如Smooks(http://www.smooks.org/)或Dozer(http://dozer.sourceforge.net)。
Dozer能够为属性指定通配符匹配。 Smooks更加面向转换,因此,您必须明确指定所有字段映射。
虽然它们都有IDE插件,但这可能有助于更容易地以更加可控的方式生成mappnigs。
答案 1 :(得分:1)
在此期间,我设计了一个快速/脏的方法,用于将DynaBeans转换为一个Map,其中(String)键被强制为小写:
private Map asLowerCaseIndexedMap(DynaBean bean) {
Map lowerCaseIndexedMap = new HashMap();
DynaProperty[] dynaProperties = bean.getDynaClass().getDynaProperties();
for (int i=0, n=dynaProperties.length; i<n; i++) {
String propertyName = dynaProperties[i].getName();
lowerCaseIndexedMap.put(propertyName.toLowerCase(), bean.get(propertyName));
}
return lowerCaseIndexedMap;
}
不幸的是,这迫使我跳过其他的箍。虽然我一直在处理豆类:
public void header(List<DynaBean> headerColumns) throws WriteException {
for (DynaBean column : headerColumns) {
int col = (Integer)column.get("columnNumber");
int width = (Integer)column.get("columnWidth");
//etcetera
现在我必须这样做:
public void header(List<DynaBean> headerColumns) throws WriteException {
for (DynaBean column : headerColumns) {
/*
* RowSetDynaClass returns beans with lower case properties by default
* but this is not guaranteed if beans are coming from Hibernate.
*
* Converting from the bean to a map however loses DynaBeans' inherent
* type conversions, which in turn entails the converting back and forth
* from String, to BigDecimal, to int as seen below
*/
Map columnMap = asLowerCaseIndexedMap(column);
int col = (new BigDecimal(columnMap.get("columnnbr").toString())).intValue();
int width = (new BigDecimal(columnMap.get("columnwdth").toString())).intValue();