2

一部のエンティティでCRUD操作を許可するJAX-WS(SOAP)を使用してWebサービスを作成しようとしています。また、Webサービスを介してこれらのエンティティでCRUDを実行する簡単な手段を提供するUIを備えたデスクトップクライアントを作成しています。

しかし、私はいくつかの設計上の問題に直面しています。クライアントがエンティティの特定のフィールドのみを表示および操作できるようにしたいのですが、この制限を課す最善の方法がわかりません。

たとえば、次のようになります。

@Entity
public class Customer {

  @Id
  @GeneratedValue
  public Long id;

  public String name;

  // neither read nor write from the web service
  public String password;

  // read-only from the web service
  @Temporal(TemporalType.DATE)
  public Date joinedAt;

  @ManyToOne
  @LazyCollection(LazyCollectionOption.FALSE)
  private List<Order> orders;

  // .. boilerplate getters and setters
}

@Entity
public class Order {

  @Id
  @GeneratedValue
  public Long id;

  public String name;
}

クライアントにこれらの基本的な操作を提供したいと思います。

  1. 注文したすべての顧客のリストを取得する
    • 彼はを除くすべてのフィールドを見ることができますpassword
  2. いくつかの注文で新しい顧客を作成する
    • FORjoinedAtとを除くすべてのフィールドへの制御を許可するpassword
  3. 顧客を変更する
    • joinedAt上記と同じように、変更または変更することはできませんpassword

  1. (1)の現在の解決策は、パスワードフィールドに@XmlTransientを追加することです。これは、パスワードを特定のクライアントに送信したいが他のクライアントには送信したくない場合に問題になります。別の解決策はcustomer.setPassword(null);、Webサービスを介してそのエンティティをマーシャリングする前に行うことです。しかし、これは本当にそれを行う方法ですか?BaseCustomer3番目の解決策は、を除くすべてのフィールドを含む基本クラスを作成することです。passwordその後、CustomerはBaseCustomer追加されたpasswordフィールドを持つになります。ユーザーは、CustomerオブジェクトではなくBaseCustomerオブジェクトを受け取ります。ただし、これには作成/更新にも問題があります。

  2. (1)と同じように、1つの解決策はcustomer.setJoinedAt(my_value); customer.setPassword(my_value); customer.setId(null);、クライアントが新しい顧客を作成したいときに実行することです。手動でヌルにすることはid本当にベストプラクティスですか?信じられない。idXmlTransientも必要ですか?では、Webサービスのユーザーはどのようにしてエンティティを変更/削除できるのでしょうか。

  3. クライアントがを変更したい場合、Customer顧客のリストを取得し、オブジェクトの1つに変更を加えてから、CustomerそのオブジェクトをマーシャリングしてWebサービスに返します。これにはいくつかの問題があります。idフィールドがXmlTransientの場合、EntityManagerのpersistは変更する行を認識せず、新しい行を作成する可能性があります。ユーザーが悪意を持っており、単にを渡すことを拒否した場合にも同様の問題が発生するため、がnullでないidことを手動で確認する必要があります。idさらに、ユーザーはpasswordフィールドを受け取っていないため、サーバーはnullのオブジェクトを受け取りました。password永続化しようとするフィールド。これにより、EntityManagerはその既存の顧客のパスワードを完全に削除すると思います。ユーザーに、変更するフィールドと値を正確に指定させるのは実用的ではないようです。

これは、一言で言えば、私が行う必要があることの概念実証にすぎないことに注意してください。提供するエンティティ、関係、および操作がはるかに多くあります。

私はこれらのテクノロジーを使用するのは初めてで、非常に高いレベルであり、非常に多くの抽象化が私の生活を楽にすることを望んでいましたが、これまでのところ、それはほとんど頭痛の種でした。この一般的な基本的なタスクを達成することは非常に難しいようです。私は何か間違ったことをしていますか?代わりにWebアプリケーションの作成を提案しないでください:)

4

0 に答える 0