2

私は現在、@Entity次のような Webプロジェクトに取り組んでいます。

@Entity
@Table(name = "variable")
@XmlRootElement
public class Variable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(unique = true, nullable = false)
    private String name;

    @Column
    @Enumerated(EnumType.STRING)
    private VariableType type;

    @Column(nullable = false)
    private String units;

    @Column
    private String description;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_on", nullable = false)
    private Date createdOn;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "retired_on", nullable = true)
    private Date retiredOn;

    @Column(nullable = false)
    private boolean core;
}

このオブジェクトをJSONに変換するために、オブジェクト@XmlRootElementをバインドするエンティティを接続していますJAXB

私のREST呼び出しメソッドは次のようになります

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getVariables() {
        return Response.ok(variableManager.getVariables()).build();
    }

このアプローチにはいくつかの問題があります。

  1. 永続性をプレゼンテーション層に緊密に結合します。バックエンドで何かが変更された場合、プレゼンテーション層で同じことが発生/公開されます。望ましくない
  2. プレゼンテーション層の戻りデータは、この場合は実行不可能なエンティティよりも少ない/多い(別のオブジェクトの複合)データである可能性があります

一般的なWebアプリケーション層には、通常3つの層があります

presentation/
business/
persistence/

プレゼンテーションを定義し、オブジェクトをJSON / XMLに変換するかどうかの決定は、プレゼンテーション層で行う必要があります。XML/JSONオブジェクトを永続層にバインドせずに変換できる方法を探しています。@XmlRootElement

あなたの考えを共有してください

4

1 に答える 1

1
  1. Web アプリケーションでは、指定した 3 つのレイヤー (プレゼンテーション、ビジネス、永続性) はすべて、その下のレイヤーに依存します。ビジネス レイヤー クラスは、永続レイヤーのサービスを使用します。プレゼンテーション サービスは、ビジネス サービスを使用します。また、永続化サービスにもアクセスできます。ビジネス オブジェクトに偶然遭遇した場合、それを使用しているプレゼンテーション内のサービスを変更しなければならないことは避けられません。
  2. 異なるタイプのオブジェクトを混在させたい場合は、ほとんどの場合、独自のシリアライザーを使用する必要があります。

XML には JAXB があります。JSON の場合、 JacksonからGsonまで何でも使用できます。

あなたが使用している JAX-RS は、Jackson を使用して、返されたオブジェクトを JSON にシリアル化すると思います。

プレゼンテーション層でのみ使用する XML および JSON 注釈でクラスに注釈を付けたくない場合はVariable、クラスのインターフェイスを抽出できます。VariableInterfaceゲッターのメソッドとのインターフェースを作成します。クラスにそれを実装させ、 JPAVariableアノテーションのみでアノテーションを付けます。これらはビジネス層に入ります。プレゼンテーションで、PresentationVariableを実装するクラスを作成しますVariableInterface。このように、依存関係はプレゼンテーションからビジネスへです。次にPresentationVariable、JSON/XML マッピング アノテーションでアノテーションを付けます。プレゼンテーションのロジックは、コンストラクターまたはユーティリティ メソッドVariablePresentationVariable介して変換する必要があり、それを返すことができます。

package business;

public interface VariableInterface {
    long getId();
    String getName();
    //more
}

@Table
public class Variable implements VariableInterface {
    @Id
    private long id;
    @Column
    private String name; 
    public long getId() {
        return id;
    }
    public long getName() {
        return name
    }
}

package presentation;

import business.VariableInterface;

public class PresentationVariable implements VariableInterface {
    @XmlElement
    private long id;
    @XmlElement
    private String name;
    public long getId() {
        return id;
    }
    public long getName() {
        return name
    }
}
于 2013-01-15T19:11:19.403 に答える