2

ExpandoValueLiferay 5.2.x では、インスタンス/レコードの変更をトリガーした何かを行ったユーザーのユーザーまたはユーザー ID を取得しようとしています。これは可能ですか?

ExpandoTableカスタム アトリビュート/expando データ モデルは、 、ExpandoColumnExpandoRow、 で表されExpandoValueます。 ExpandoValue誰が最後に変更したかを追跡するフィールドがないようです。追加するにはどうすればよいですか?これは良い考えですか?

または、ExpandoValueListenerモデル リスナーがあります。ただし、モデル リスナーは特定のリクエストから切り離されているように見えます。これは、リスナー メソッドがモデルの変更に対して「反応的に」起動されるためです。インターフェイスのどのメソッド ヘッダーにModelListenerも、いかなる種類の Request も、ServiceContext (Request から構築されたもの) も含まれていません。

それでも、Request、ServiceContext、または ModelListener メソッド (おそらくメソッドの 1 つ) 内から現在の UserId を取得するための他のメカニズムにアクセスする方法はありonBefore*()ますか? 私は何人かの人々が使用を推奨しているのを見てきましたが、それは時々PrincipalThreadLocal返されるようnullです.

何か案は?代わりにボタンのクリックをトラップする必要がありますか? DBトリガーやモデルリスナーなどよりも面倒で維持するのが難しいので、私はそれを避けようとしています。

前もって感謝します!

4

1 に答える 1

3

Liferay 6は、s のServiceContextThreadLocalスタックを保持するクラスを追加することで、この問題を解決しているようServiceContextです。またBasePersistenceImpl

public T update(T model, boolean merge, ServiceContext serviceContext)

コンテキストをプッシュし、モデル リスナーを起動して、コンテキストをポップする便利なメソッド。アイデアは、実装されている中で、今ServiceContextから取得できるということです。ServiceContextThreadLocalModelListener

Liferay 5.2.x でこれを模倣しようとするつもりはありません。なぜなら、この方法で永続化レイヤーを変更することは私のプロジェクトの範囲を超えているからです。結局のところ、ボタンがクリックされたときに、struts processAction からストアド プロシージャを呼び出すだけだと思います。

これは、コードのメンテナンスと読みやすさの観点から、これを処理するためのおそらく最悪の方法ですが、このようなイベントが 3 つしかなく、時間が非常に短いという事実も、この決定に貢献しています。Liferay 6にアップグレードできる場合は、これらをmodelListener / serviceContextに折りたたむことができれば幸いです.

于 2012-07-18T20:05:22.070 に答える