一部のエンティティで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;
}
クライアントにこれらの基本的な操作を提供したいと思います。
- 注文したすべての顧客のリストを取得する
- 彼はを除くすべてのフィールドを見ることができます
password
- 彼はを除くすべてのフィールドを見ることができます
- いくつかの注文で新しい顧客を作成する
- FOR
joinedAt
とを除くすべてのフィールドへの制御を許可するpassword
- FOR
- 顧客を変更する
joinedAt
上記と同じように、変更または変更することはできませんpassword
。
(1)の現在の解決策は、パスワードフィールドに@XmlTransientを追加することです。これは、パスワードを特定のクライアントに送信したいが他のクライアントには送信したくない場合に問題になります。別の解決策は
customer.setPassword(null);
、Webサービスを介してそのエンティティをマーシャリングする前に行うことです。しかし、これは本当にそれを行う方法ですか?BaseCustomer
3番目の解決策は、を除くすべてのフィールドを含む基本クラスを作成することです。password
その後、CustomerはBaseCustomer
追加されたpassword
フィールドを持つになります。ユーザーは、CustomerオブジェクトではなくBaseCustomerオブジェクトを受け取ります。ただし、これには作成/更新にも問題があります。(1)と同じように、1つの解決策は
customer.setJoinedAt(my_value); customer.setPassword(my_value); customer.setId(null);
、クライアントが新しい顧客を作成したいときに実行することです。手動でヌルにすることはid
本当にベストプラクティスですか?信じられない。id
XmlTransientも必要ですか?では、Webサービスのユーザーはどのようにしてエンティティを変更/削除できるのでしょうか。クライアントがを変更したい場合、
Customer
顧客のリストを取得し、オブジェクトの1つに変更を加えてから、Customer
そのオブジェクトをマーシャリングしてWebサービスに返します。これにはいくつかの問題があります。id
フィールドがXmlTransientの場合、EntityManagerのpersistは変更する行を認識せず、新しい行を作成する可能性があります。ユーザーが悪意を持っており、単にを渡すことを拒否した場合にも同様の問題が発生するため、がnullでないid
ことを手動で確認する必要があります。id
さらに、ユーザーはpassword
フィールドを受け取っていないため、サーバーはnullのオブジェクトを受け取りました。password
永続化しようとするフィールド。これにより、EntityManagerはその既存の顧客のパスワードを完全に削除すると思います。ユーザーに、変更するフィールドと値を正確に指定させるのは実用的ではないようです。
これは、一言で言えば、私が行う必要があることの概念実証にすぎないことに注意してください。提供するエンティティ、関係、および操作がはるかに多くあります。
私はこれらのテクノロジーを使用するのは初めてで、非常に高いレベルであり、非常に多くの抽象化が私の生活を楽にすることを望んでいましたが、これまでのところ、それはほとんど頭痛の種でした。この一般的な基本的なタスクを達成することは非常に難しいようです。私は何か間違ったことをしていますか?代わりにWebアプリケーションの作成を提案しないでください:)