Hibernateを使用する既存のWicketアプリケーションの作業を開始しました。JAX-RSを使用して(同じWebアプリ内の)HibernateデータにRESTfulインターフェイスを追加しています。JAX-RSサーブレットはWicketとまったく通信しません---Hibernateセッションを独立して作成します。
次のクラスをUser
使用してHibernateエンティティ(これもJAXBマーシャブル)として定義されているクラスがありますnet.databinder.auth.data
。
@Entity
@Table(name = "user")
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement
public class User extends AbstractEntity implements DataUser {
BasicPassword
パスワードの設定(埋め込み可能なnet.databinder.auth.data
タイプ)をRESTfulインターフェイスに追加しようとするまで(今まではパスワードプロパティを無視していました)、すべてが正常に機能していました。
@XmlTransient
public void setPassword(BasicPassword password) {
this.password = password;
}
@XmlElement
public void setPassword(String password) {
setPassword(new BasicPassword(password));
}
突然、Apache CXF-JAXRS + Jackson +JAXBが着信JSONユーザーオブジェクトをHTTPPUTでアンマーシャルしようとすると、それが呼び出さuser.setPassword("...")
れ、次のエラーが発生します。
WARN - ApplicationExceptionMapper - WebApplicationException has been caught : There is no application attached to current thread "http-bio-8080"-exec-5 (through reference chain: com.example.entity.User["password"])
おっと---Wicketはどこから来たのですか?Apache CXF-JAXRSは、JAXBアノテーションを使用して着信ユーザー仕様をアンマーシャリングし、バインドされていないHibernateUser
オブジェクトを作成するJacksonプロバイダーを呼び出す必要があります。文字列を使用してパスワードを設定しようとし、convenienceメソッドは文字列をBasicPassword
インスタンスに変換します。私が見る限り、これはWicketとは何の関係もありません。
なぜWicketがここに関与しているのですか?この時点ではWicketは必要ないか、必要ありません---新しいデタッチされたHibernateオブジェクトを作成する必要があります。