grails サービスで g.render を使用しようとしていますが、g はデフォルトでサービスに提供されていないようです。サービスでビューをレンダリングするテンプレート エンジンを取得する方法はありますか? 私はこれについて間違った方法で行っているかもしれません。私が目指しているのは、ビューを部分的なテンプレートから文字列にレンダリングし、結果の文字列を JSON 応答の一部として送り返し、AJAX 更新で使用することです。
何かご意見は?
私は John の主張に完全に同意します。サービスで GSP を実行することは、一般的に悪い設計上の決定です。しかし、例外なくルールはありません!それでもやりたい場合は、次の方法を試してください。
class MyService implements InitializingBean {
boolean transactional = false
def gspTagLibraryLookup // being automatically injected by spring
def g
public void afterPropertiesSet() {
g = gspTagLibraryLookup.lookupNamespaceDispatcher("g")
assert g
}
def serviceMethod() {
// do anything with e.g. g.render
}
}
もちろん、gspTagLibraryLookup Bean を使用すると、サービス内の他のすべての必要な taglib にアクセスできます。
Grails 2 では PageRenderer を使用してさらに簡単になりました。例えば:
class SomeService {
def groovyPageRenderer
void someMethod() {
String html = groovyPageRenderer.render(view: '/email/someTemplateName')
}
}
API - http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html
より完全な例 - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html
私のアドバイスは、コントローラーでこれを行うことです。サービスには再利用可能なロジックが必要であり、ビュー テンプレートに依存せず、その作業はコントローラーに任せます。サービスを使用して、テンプレートに渡す必要があるデータを取得しますが、テンプレートとやり取りする作業はコントローラーに任せます。
これは、 Stefan のに似たソリューションですが、少し単純です。
import org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
class MyService implements ApplicationContextAware {
private ApplicationTagLib g
void setApplicationContext(ApplicationContext applicationContext) {
g = applicationContext.getBean(ApplicationTagLib)
// now you have a reference to g that you can call render() on
}
}