1

私は単純な RESTFul サービスを構築しています。そしてそれを達成するには、2つのタスクが必要です:

  • リクエスト パラメータからリソース (つまり Book) のインスタンスを取得し、そのインスタンスを永続化できるようにします
  • そのインスタンスから XML ドキュメントを作成して、表現をクライアントに送信します。

現在、POJO クラスで両方のことを行っています。

public class Book implements Serializable {

    private Long id;

    public Book(Form form) {
        //Initializing attributes
        id = Long.parseLong(form.getFirstValue(Book.CODE_ELEMENT));
    }

    public Element toXml(Document document) {
        // Getting an XML Representation of the Book
        Element bookElement = document.createElement(BOOK_ELEMENT);
    }

動作はデータがある場所にあるべきだという OO の原則を思い出しましたが、今では私の POJO は Request および XML API に依存しており、それは正しくないと感じています (また、そのクラスには永続化の注釈があります)。

その問題を解決するための標準的なアプローチ/パターンはありますか?

編集: 私が使用しているライブラリは Restlets と Objectify です。

4

2 に答える 2

1

動作はデータがある場所にあるべきだというあなたの意見に同意します。しかし同時に、あなたが言うように、シリアライゼーション手段に使用される特定のメソッド(JSON、XMLなど、方法によってはかなり大きくなる可能性があります)でPOJOインターフェイスを汚染するのは快適ではありません。

1) そのインスタンスから XML ドキュメントを作成して、表現をクライアントに送信します。

オブジェクトをシリアル化ロジックから切り離すために、戦略パターンを採用します。

interface BookSerializerStrategy {
    String serialize(Book book);
}

public class XmlBookSerializerStrategy implements BookSerializerStrategy {

    public String serialize(Book book) {
        // Do something to serialize your book.
    }

}

public class JsonBookSerializerStrategy implements BookSerializerStrategy {

    public String serialize(Book book) {
        // Do something to serialize your book.
    }

}

POJO インターフェイスは次のようになります。

public class Book implements Serializable {

    private Long id;
    private BookSerializerStrategy serializer

    public String serialize() {
        return serializer.serialize(this);
    }

    public void setSerializer(BookSerializerStrategy serializer) {
        this.serializer = serializer;
    }
}

このアプローチを使用すると、シリアライゼーション ロジックを 1 か所だけに分離することができ、それによって POJO が汚染されることはありません。さらに、String を返すことで、POJO をクラスDocumentおよびElementと結合する必要がなくなります。

2)リクエストパラメーターからリソース(つまりBook)のインスタンスを取得して、そのインスタンスを永続化できるようにします

私の意見では、逆シリアル化を処理するパターンを見つけることはより複雑です。POJO からこのロジックを削除するために、静的メソッドを使用して Factory を作成する以外に良い方法はありません。

あなたの2つの質問に答える別のアプローチは、JAXBが使用するようなものです.2つの異なるオブジェクト、デシリアライゼーションを担当するアンマーシャラーとシリアライゼーション用のマーシャラーです。Java 1.6 以降、JAXB はデフォルトで JDK に付属しています。

最後に、これらは単なる提案です。私は実際にあなたの質問に本当に興味を持ち、他の可能な解決策に興味を持ちました.

于 2012-04-17T10:35:13.270 に答える
0

プロジェクトで Spring またはその他のフレームワークを使用していますか? Spring を使用している場合は、シリアライゼーションを処理し、リクエスト パラメータをメソッド パラメータに割り当てます (必要に応じて解析します)。

于 2012-04-15T16:43:46.200 に答える