4

Java EE 7 と WildFly 9 を使用して、モバイル/Web アプリケーションのカスタム バックエンドを開発しています。バックエンドは、通信ロジック (JAX-RS)、ビジネス ロジック (セッション EJB)、および永続層 (Hibernate) を備えた従来の 3 層システムです。

ビジネス ロジック層は一連のサービスで構成され、それぞれがインターフェイスと EJB 実装によって定義されます。仮定しましょう

public interface IPostService {
    List<PostDTO> getAllPosts();
}

@Stateless
public class PostService implements IPostService {
    List<PostDTO> getAllPosts(){
    // retrieving my Posts through Hibernate
    }

持つ

public class PostDTO {

    private Long id;
    private String title;
    // UserDTO is a VEEERY big object
    private UserDTO author;

    // getters and setters
}

場合によっては、クライアントが postidとのみに関心があるとしますtitle。API エンドポイントは、取得するフィールドのリストを含むクエリ パラメータを受け取ります。したがって、JSON でシリアル化された DTO には、 postidtitle. UserDTO目標は、不要なときに非常に大きなオブジェクトをロードするために不要な処理を避けることです。

単純な解決策は、カスタムList<String> desiredFieldsパラメータをに追加することgetAllPosts()です。ほとんどすべてのサービス メソッドにこのパラメーターを追加する必要があるため、これは私にはあまり納得できません。

それを行うためのベストプラクティスは何ですか? この目的を意図したJava EEオブジェクトはありますか?

4

2 に答える 2

0

一意のモデル クラス インスタンスを直接返すことで、JPA と JAXB アノテーションを組み合わせて、PostDTO の代わりにPostとしましょう。 RESTful Web サービス層から。

レイヤーとマッピング(エンティティ/ dto)を減らすことでアプリケーションコードを簡素化するため、私は個人的にこれを頻繁に行っています。詳細については、これらのスライドを参照してください。

CRUD 操作に最適で、純粋な Java EE 7 ソリューションだと思います。余分なライブラリを使用する必要はありません。

Post.java は次のようになります。

import javax.persistence.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Post {

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

    private String title;

    @XmlTransient
    @ManyToOne
    private User persistedAuthor;

    @Transient
    private User author;

    // + Getters and Setters ...

}

長所:

  • テスト、コーディング、保守するための DTO / エンティティ マッピングがない
  • 永続化/ビジネス/検証ルールを配置できるモデル レイヤーは 1 つだけです
  • Java EE 7 ソリューション、余分なライブラリを使用する必要はありません

短所:

  • モデルは JPA に関連付けられています。したがって、永続化ソリューションを変更し、複数の異なる永続化レイヤーを管理できない場合は、これを変更する必要があります。

編集

作成者を取得したい場合があるため、REST 操作のサンプルに対して QueryParam fetchAuthor を true/false に設定していると仮定すると、追加の JPA @Transientプロパティを作成などのモデル オブジェクトに追加し、必要に応じて初期化する必要があります。 . したがって、これは Post Java クラスでの追加のマッピングですが、上記の利点は維持されます。作成者プロパティを初期化するには、getPersistedAuthor() の戻り値を設定するだけです (これにより、クエリがトリガーされ、遅延読み込みで永続化された作成者が取得されます)。

于 2015-12-08T21:36:29.560 に答える