관점에서 성배 서비스를 부르는 방법?
문제
간단한 질문 : 서비스 수업이 있습니다 (말하자 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는 옳습니다. 서비스는 실제로 견해 내에서 사용되어서는 안되며, 특히 거래 및 최대 절전 모드 세션과 관련된 문제를 진단하기가 어려울 수 있습니다.
이 그루비 인라인 코드가 작동한다는 것을 알았습니다.
<% 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 조언을 시도해 볼 것입니다.
세트 태그를 사용하여 태그 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