0

Hibernate 経由で返される具体的なデータ Bean、または Jakarta Commons/BeanUtils の RowSetDynaClass (JDBC 結果セットをラップする) を使用して返される DynaBeans で動作する機能を開発しています。RowSetDynaClass はデフォルトですべての Bean プロパティ名を小文字に強制し、WrapDynaBean を使用してすべての具体的な Bean を Hibernate から DynaBeans に変換する必要があります。RowSetDynaClass によるデフォルトの小文字化は良い考えのように思えますが、具体的な Bean のプロパティ名がどのように大文字化されるかを事前に知ることはできません。Hibernate の構成により、対応するテーブルの列名と同じように大文字と小文字を区別する必要はありません。

BeanUtils を使用してプロパティ名を小文字にする機能が組み込まれていますか? RowSetDynaClass 以外に文書化されているのが見つかりません。BeanUtilsに組み込まれているものの代わりに、これを自分で達成するための最良の方法を誰かが提案できますか?

4

2 に答える 2

2

DynaBeans を (文字列) キーが強制的に小文字に変換されるマップに変換するために、私がその間に考案したクイック/ダーティな方法を次に示します。

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();
于 2009-09-03T18:36:37.877 に答える
1

私はそれを行う簡単な方法を知りません。Resolver インターフェースの独自の実装を作成できる可能性があります。

それ以外の場合は、Smooks ( http://www.smooks.org/ ) や Dozer ( http://dozer.sourceforge.net )などの他の変換フレームワークを使用することをお勧めします。

Dozer には、プロパティのワイルドカード マッチを指定する機能があります。Smooks はより変換指向であるため、すべてのフィールド マッピングを明示的に指定する必要があります。

ただし、どちらにも IDE プラグインがあり、マップニグをより簡単に、より制御された方法で生成するのに役立つ場合があります。

于 2009-09-03T11:32:44.710 に答える