2012-06-19 7 views
9

私は基本的に同じ財産である何のために異なるプロパティ名を使用するサードパーティのJavaクラスの束がありますCanonicalizingのJava Beanのプロパティ名

public class Foo { 
    public String getReferenceID(); 
    public void setReferenceID(String id); 
    public String getFilename(); 
    public void setFilename(String fileName); 
} 

public class Bar { 
    public String getRefID(); 
    public void setRefID(String id); 
    public String getFileName(); 
    public void setFileName(String fileName); 
} 

私は、これらに対処できるようにしたいと思いますが私は多形的にそれらを扱うことができるように、フォームを正規化し、私は同じようにApache々BeanUtilsとものを行うことができます。

PropertyUtils.copyProperties(object1,object2); 

明らかに、各クラスのアダプタを書くことは些細なことでしょう...

public class CanonicalizedBar implements CanonicalizedBazBean { 
    public String getReferenceID() { 
     return this.delegate.getRefID(); 
    } 
    // etc. 
} 

しかし、そこにはもっと一般化され動的なものがあるのだろうか?プロパティ名の同値性とデリゲートクラスの1対多のマップをとり、アダプタを生成するものは何か?

答えて

6

私はそれを使ったことがないが、私はあなたがDozerを探していると思う:

ドーザーは、その別のオブジェクトから再帰的にコピーするデータ Java BeanがマッパーにJava Beanがあります。通常、これらのJava Beanは異なる複合型の になります。

Dozerは、単純なプロパティマッピング、複合型マッピング、 双方向マッピング、暗黙的明示的マッピング、および 再帰的マッピングをサポートしています。これには、 も要素レベルでのマッピングが必要なコレクション属性のマッピングが含まれます。

Dozerは属性名間のマッピングをサポートするだけでなく、タイプ間で自動的に変換する もサポートしています。ほとんどの変換シナリオでは、 がサポートされていますが、DozerではXMLによるカスタム の変換を指定することもできます。

+0

ありがとうございました。望ましくない中間段階なしで正確な仕事をすると思われる。 – slim

4
  1. 最初のオプションがDozerです。

  2. 第2のオプションはSmooksフレームワーク で調整します。 Smookのグラフィカルマッパーを使用することは有益です。

  3. カスタムマッパーを使用する別のオプションはXStreamです。多分

2

そのような何か:

public class CanonicalizedBar implements CanonicalizedBazBean { 
public String getReferenceID() { 
    Method m = this.delegate.getClass().getDeclaredMethod("getReferenceID"); 
    if(m == null) 
     m = this.delegate.getClass().getDeclaredMethod("getRefID"); 
    ... 
    return m.invoke(); 
} 
// etc. 
} 
2

私は個人的にそれを使用したことがない、けれども。私は、orikaというプロジェクトが、最高のパフォーマンスと多くのそのようなマッピングを自動的に理解する能力を持っていることに注目しました。 それでも、カスタムマッピングをサポートし、生​​成されたコードを使用して暗黙的にアダプタを定義します。

カスタムマッパーを定義することもできます。カスタムマッパーを定義することができます。メンバーナンバーをどのように正規化して、その知識を使用してすべてのオブジェクトに対して真のマッピングを作成するかを知っている場合です。例えば:

DefaultFieldMapper myDefaultMapper = new DefaultFieldMapper() { 
    public String suggestMapping(String propertyName, Type<?> fromPropertyType) { 
     // split word according to camel case (apache commons lang) 
     String[] words= StringUtils.splitByCharacterTypeCamelCase(propertyName); 
     if(words[0].length() > 6) { 
     // trim first camel-cased word of propery name to 3 letters 
     words[0]= words[0].substring(0,2); 
     return StringUtils.join(words); 
     } else { 
     // remains unchanged 
     return propertyName; 
     } 
    } 
} 

mapperFactory.registerDefaultFieldMapper(myDefaultMapper); 
1

私はそれであまり行っていないが、あなたはこれを行うにはAspect Oriented Programmingを使用することができます。

どうすればいいのですか?私は、内部的に実際のメソッドを呼び出す各クラスにメソッドを追加すると思います。このarticleを参照して、ミックスインについて話します。

AspectJは、おそらく最も一般的な実装です。

関連する問題