2010-03-24 5 views
27

Come posso richiamare un servizio direttamente da una vista? Sto provando con ${my.domain.service.method}, ma si lamenta che non riesce a trovare la proprietà.Come si chiama un servizio Grails da un gsp?

E no, non voglio usare un controller perché la vista è un modello.

+0

vedi anche http://stackoverflow.com/questions/ 1607186/how-to-call-a-grails-service-in-a-view – Gregor

risposta

9
<%@ page import="com.myproject.MyService" %> 
<% 
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance() 
%> 

E poi si può chiamare ${myService.method()} secondo lei SPG

essere consapevoli del fatto che chiamando transazionali metodi di servizio dalle viste male le prestazioni. Meglio spostare tutte le chiamate del metodo di servizio transazionale sul controller (se è possibile)

+0

Grazie per la risposta. Ho impostato transactional = false, che dovrebbe migliorare le prestazioni. – xain

+0

Sì sicuramente. – fabien7474

+8

Mentre funziona, sarebbe molto più elegante iniettare il servizio nella vista tramite il modello o creare un taglib per il servizio e utilizzarlo dalla vista. –

40

Meglio utilizzare la libreria di tag perché la creazione di un'istanza di servizio direttamente nella vista tramite il caricatore di classi NON autorizzerà altri servizi dichiarati che potrebbero vivere in il servizio che stai tentando di utilizzare.

Utilizzando la libreria di tag si avrà l'auto-cablaggio di tali servizi.

Secondo lei SPG <g:customTag param1="$modelObjec" param2="someString" />

Nella cartella taglib (yourApp/grails-app/taglib/com/something/MyAppTagLib):

package com.something 

class MyAppTagLib { 

    def myService // This will be auto-wired 

    def customTag = { attribs -> 
     def modelObj = attribs['param1'] 
     def someString = attribs['param2'] 

     // Do something with the params 

     myService.method() 

     out << "I just used method of MyService class" 
    } 
} 

tuo MyService:

package com.something 

class MyService { 

def anotherService // This will be auto-wired 

def method() { 
    anotherService.anotherMethod() 
} 

} 
+0

grazie, questa è la migliore risposta – iberck

20

Penso che il modo migliore di farlo è:

<% 
    def myService = grailsApplication.mainContext.getBean("myService"); 
%> 

In questo modo, si ottiene l'istanza del servizio senza perdere i servizi autowired.

+0

puoi dirmi qual è la differenza di questa chiamata da quella nella risposta di @ fabien7474? –

+1

@spartacus nella sua risposta, crea una nuova istanza del servizio e, quindi, ottiene solo un semplice oggetto della classe di Service con tutte le sue dipendenze insoddisfatte. Nella mia risposta, ottengo il bean di servizio dal contenitore utilizzato dal framework, già iniettato con i bean di cui ha bisogno. –

+1

@Spartacus La risposta di Suganthan è migliore della mia, però. –

29

Prova questa - molto utile

%{--Use BlogService--}% 
<g:set var="blog" bean="blogService"/> 

<ul> 
    <g:each in="${blog.allTitles()}" var="title"> 
     <li>${title}</li> 
    </g:each> 
</ul> 

Refer this

Anche questa non è una cosa Recommened, si può sempre usare taglib

+4

la migliore risposta –

+4

Sicuramente il modo migliore –

+0

Mi sto organizzando org.springframework.beans.factory.NoSuchBeanDefinitionException –