2

ネストされたプロパティのフラットな Map<String, String> を Bean にディープ コピーする最も簡単な方法を探しています。ネストされたプロパティの一部は、インスタンス化の戦略を提供したいインターフェイスです。例えば:

Map<String, String> customer = new Map<String, String>();
customers.put("id", "123");
customers.put("address.line1", "221B Baker St.");

public class Customer {
  private int id;
  private Address address; //address is an interface
  ... getters/setters ...
}

明示的なマッピングを提供したくないことに注意してください。インターフェースの具体的なインスタンスを提供するための戦略にすぎません。commons-beanutils がこれを行うと仮定しましたが、それらは機能に対するオープンなJIRAチケットです。同様の機能を持つライブラリは、InstanceCreatorと呼ばれるインターフェースを提供する Google GSONです。

beanutils の上にソリューションを実装しましたが、この機能が組み込まれた bean 変換ライブラリはありますか?

4

2 に答える 2

0

これをもっと難しくしているのではないかと思います。私がすることは、マークアップまたは他の形式との間でシリアル化することです。要件が何であるかはわかりませんが、JAXBXStreamなど、すべての優れたマーシャラーがこれを実行します。

JAXBを使用すると、次のようなことができます。

@XmlRootElement(name="customer")
public class Customer
{
    private int id;
    private Address address;
}

@XmlRootElement(name="address")
public class Address
{
    private String city;
}

そして、次のXMLを使用します。

<customer>
    <id>1234</id>
    <address>
        <city>Kansas City</city>
    </address>
</customer>

...マーシャリングおよびアンマーシャリングを行ったり来たりすることができます。また、JAXBマーシャラー(jersey-jsonなど)には他にもいくつかの実装があるため、他の形式でマーシャリングすることもできます。

{
    "customer": 
    {
        "id":1234,
        "address": 
        {
             "city":"Kansas City"
        }
    }
}

マップを使用する必要がある特別な理由はありますか?そうでない場合は、解決策は複雑なReflectionsユーティリティだけであり、GSONライブラリのようなものが複雑さを促進できることを願っています。

編集:マッピングを望まないことについての宣伝文句を見ただけです...私はそれを本当に理解していません。シリアル化を使用した後、同様のことを行う他の方法は価値がないようです。

于 2010-07-02T04:42:59.227 に答える
0

あなたは2つの異なるものを表現しています。簡単にできるのは、最初に説明しているように見える、深くネストされた文字列のマップです。そう

put("id", "1")  -> map.put("id", "1")
put("address.line1", "221b")  -> ((Map)map.get("address")).put("221B")

(簡潔にするために、実際の安全性チェックはそこにあるマップであることを無視しています。そうであれば初期化してください。ヤッダヤッダ、Javaの簡潔なやり方が好きになるすべてのもの。)

「abcd ..」を配置すると、「。」による分割が再帰的にドリルダウンされます。

実際に「住所」が必要な場合。(あなたの例では Address クラスを参照しているため) Address 型のオブジェクトを参照するには、もう少し複雑です。プレフィックスをクラスとして認識する何か、できればマップに応答するカスタムが必要になります。インターフェイスであり、ツリーをトラバースするときに簡単にインスタンス化でき、入力文字列からそれ自体のオブジェクトを作成する方法を知っています。

最初の beanutils 実装の詳細についてはよくわかりませんが、書くのはそれほど難しくありません。しかし、文字列のネストされたマップは簡単です。これは、シリアル化 (ハッシュマップと文字列がシリアル化されるため) または json ライブラリを使用して簡単にパックできます。これは、ネストされた文字列マップをまったく問題なく使用する必要があります (Google gson はうまく機能します)。

于 2010-07-02T03:24:23.570 に答える