そのため、コンテンツを構築する目的でレイアウトにデータを渡すアプリを作成しています。したがって、データをレイアウトに渡すときに、そのためにフィルターを作成しました。このフィルターは、基本的に、現在ログインしているユーザーを調べてから、そこのアカウントに入り、最後にアカウントのすべてのオプションを調べます。下:
class OptionsFilters {
def springSecurityService
def filters = {
all(controller:'*', action:'*') {
before = {
}
after = { viewModel ->
if(springSecurityService.currentUser != null && springSecurityService.currentUser.acc.options.size() > 0)
{
viewModel.options = springSecurityService.currentUser.acc.options
}
}
afterView = { Exception e ->
}
}
}
}
これで、ユーザーが表示するオプションを持っていない限り、そのデータを非表示にするように設計された次のコードが作成されました。
<g:each var="option" in="${ options }">
<g:if test="${option.name == 'email'}">
//The data to show if they have the option
</g:if>
</g:each>
面白いことに、このコードは、ユーザー アカウントに既にオプションがアタッチされている場合 (または少なくとも 1 つ) は正常に機能しますが、シナリオは、アプリを実行し、オプションのないアカウントを持っているユーザーがいるということです。当分の間、レイアウト内のデータは非表示になります。次に、アカウントに移動して「メール」オプションを追加し、保存をクリックすると、正しい表示ビューが表示され、レイアウトのコンテンツも表示されるはずです。ただし、これは起こることではなく、次のエラーが発生します。
Cannot set property 'options' on null object. Stacktrace follows:
Message: Cannot set property 'options' on null object
Line | Method
->> 25 | doCall in tool.OptionsFilters$_closure1_closure2_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 195 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 895 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 918 | run . . in ''
^ 662 | run in java.lang.Thread
私のテストから、このエラーは自分のアカウントのオプションを更新しているときにのみ発生しているように見えることに気付きました. ユーザー名に関連付けられたアカウント オプションの更新と、処理のためにそのデータを参照するフィルターとの間の、ある種のタイミングの問題だと思います。
これに関するご支援をいただければ幸いです。
前もって感謝します