2

この質問でお手数をおかけして申し訳ありませんが、私は最終的にヘッドストンパーを見つけてしまい、これを間違った方法で扱っているのではないかと思っています.

のコレクションを含むクラスをマッピングしorg.springframework.security.core.authority.SimpleGrantedAuthorityて、ORM によって熱心にロードされたクラスを春のセキュリティ クラスに送信する必要がないようにしたいと考えています。しかし、その "role" 属性は getter "getAuthority" に関連付けられており、オリカが問題を起こすのはそのときです。Orika に getter によって返された値を使用させて、宛先クラスの setter に入れることはできますか?

あなたが十分に気にかけているなら、ここに私の問題の少しの文脈があります. アプリに Spring セキュリティを使用しています。org.springframework.security.core.userdetails.UserDetailsユーザーが認証され、権限があるかどうかをSpringが確認できるように、を返すサービスがあります。私たちが持っている UserDetail の実装は、という名前のローカルのものUserです。このクラスは を実装しているため、このユーザーの権限を返すorg.springframework.security.core.userdetails.UserDetailsメソッドがあります。public Collection<? extends GrantedAuthority> getAuthorities();

Userデータベースにこれがあり、休止状態で処理されたという事実を除いて、すべてが順調でした。開いているセッションを表示したままにする最初の選択肢。私たちはそれを望んでいません。2 番目の選択肢は、ORM、EARGER のフェッチを行うことでした。私たちもそれを望んでいませんでした。そこで、DTO を使用して UserDetail を実装し、それを orika でマッピングすることにしました。その時、すべての地獄が解き放たれました。org.springframework.security.core.GrantedAuthorityインターフェースです。使用している具象クラスはorg.springframework.security.core.authority.SimpleGrantedAuthority. これは、属性名が「role」であるにもかかわらず、その getter が「getAuthority」であるため、マップするのが難解で危険なクラスです。

public String getAuthority() {
    return role;
}

スプリングチームとオリカチームはあまり仲が良くないようです。それ以外の場合は、Java 標準に従ってプロパティに名前を付け、orika はそれを直接マッピングしたでしょう。また、私はこの特定のケースのためにカスタム マッパーを定義することに消極的であり、それが私を悩ませてきました。すべての「魔法」を特定のクラスのカスタムマッパーに置き換える以外に、ゲッターメソッドによって返された値をオリカに使用させる既知の方法はありますか?

4

2 に答える 2

2

結局、私のように頑固であることは報われます :)

トリックに訴えることなく、問題を修正しました。私のマッピングを妨げていた問題は、ゲッターによって返されたコレクションのジェネリックでした。ご覧のとおり、orika は次のマッピングを処理できないようです...少なくとも、私は知りませんでした。

public List<? extends GrantedAuthority> getAuthorities() {
    return this.role;
}

私はそれをに変えました

public List<GrantedAuthority> getAuthorities() {
    return this.role;
}

そしてうまくいきました!

時間と注意をありがとう!

于 2013-12-05T03:21:31.757 に答える
1

ユーザーオブジェクトには、次のような役割 (GrantedAuthority を拡張する) が設定されています。

private Set<Role> roles = new HashSet<Role>();

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
public Collection<? extends GrantedAuthority> getAuthorities() {
    return roles;
}

遅延ロードされていることに注意してください。ただし、eager fetch に切り替えても問題は発生しません。

private Set<Role> roles = new HashSet<Role>();

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
public Collection<? extends GrantedAuthority> getAuthorities() {
    return roles;
}

私は Orika にあまり詳しくありませんが、そのドキュメントをざっと見ると、Orika にとって簡単な Hibernate 対応のエンティティを使用して GrantedAuthority を簡単に拡張できるようです。

于 2013-12-04T04:32:10.763 に答える