문제

간단한 질문 : 서비스 수업이 있습니다 (말하자 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top