ビューでGrailsサービスを呼び出す方法は?
質問
簡単な質問:
サービスクラス(たとえば helpersService
)とメソッド def constructURI(params)
があります。
テンプレートビューからこのメソッドを呼び出すにはどうすればよいですか。
次のコードを試してみましたが成功しませんでした
<% def helpersService = new HelpersService() // or def helpersService
%>
<img src="${helpersService. constructURI(params)}"/>
しかし、次の結果が得られます。
No signature of method: com.HelpersService. constructURI() is applicable for argument types...
または( def helpersService
を使用する場合)
Cannot invoke method constructURI() on null object
アイデアはありますか
解決
サービスは、ビュー内で使用されることを意図していません。依存性注入を介してサービスへの参照を取得できるTagLibを作成できます。
他のヒント
ビューがコントローラーによってレンダリングされていると仮定すると、より簡単な方法は、アクションからモデル内のビューにサービスへの参照を渡すことです。つまり:
class someController {
def someService
def someAction = {
render(view: 'someView', model: ['someService': someService])
}
}
ビュー内で期待するとおりに使用できます。ビューによってレンダリングされたテンプレートの場合、テンプレートへの参照も渡す必要があることは明らかです。ただし、明確にするために、S。Puchbauerは正しい。サービスは実際にビュー内で使用されることを想定していないため、特にトランザクションやHibernateセッションに関連する問題の診断が困難になる場合があります。
このグルーヴィーなインラインコードが機能することがわかりました:
<% def xxxService = application.getAttribute("org.codehaus.groovy.grails.APPLICATION_CONTEXT").getBean("xxxService") %>
次のようにサービスの関数を呼び出すことができます:
<g:select optionKey="key" from="${xxxService.getWhateverList()}" name="tarif" value="${accountInstance?.tarif}" ></g:select>
次のコードで回避策を見つけました:
def helpersService = grailsApplication.classLoader.loadClass('HelpersService').newInstance()
ただし、依存性注入を介してサービスを使用する方がよいため、Siegfriedのアドバイスを試してみます。
setタグを使用して、タグlibを作成せずにこれを簡単に行うことができます。
<g:set var="versionService" bean="versionService"/>
...
<p>version ${versionService.clientVersion}</p>
ここでこの解決策を見つけました: http: //mrhaki.blogspot.com/2013/08/grails-goodness-use-services-in-gsp.html