質問

簡単な質問: サービスクラス(たとえば 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top