2009-11-22 7 views
17

Ich versuche g.render in einem Grails-Service zu nutzen, aber es scheint, dass g nicht auf Dienste standardmäßig vorgesehen ist. Gibt es eine Möglichkeit, die Templating-Engine dazu zu bringen, einen Blick in den Dienst zu werfen? Ich gehe vielleicht in die falsche Richtung. Worauf ich achten möchte, ist das Rendern der Ansicht von einer partiellen Vorlage in eine Zeichenfolge und das Senden der resultierenden Zeichenfolge als Teil einer JSON-Antwort, die mit AJAX-Aktualisierungen verwendet werden soll.Mit g.render in einem Grails Service

Irgendwelche Gedanken?

+0

Für alle Forscher, die später in vielen Jahren über diese Seite lo wandern, vergessen Sie nicht, dass eine Vorlage aus einem Service-Rendering-Einrichtung dass die Vorlage nicht den gleichen Kontext hat, den sie hätte, wenn sie von einem Controller gerendert würde; Wenn Sie also beispielsweise im GSP "createLink" verwenden, müssen Sie sowohl den 'Controller' als auch den' action' angeben! –

Antwort

27

ich total mit John Argumentation zustimmen - GSP in Dienste tun, ist generell eine schlechte Design-Entscheidung. Aber keine Regeln ohne Ausnahmen! Wenn Sie immer noch, dies zu tun, versuchen Sie die folgende Vorgehensweise:

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 
    } 
} 

die gspTagLibraryLookup bean Verwenden Sie jede andere gewünschte taglib in einem Service natürlich zugreifen können.

+0

mit großer Macht kommt große Verantwortung! becareful wenn Dinge wie dies tut - stellen Sie sicher, die Gründe für Rendering gsp in einem Dienst kennen, bevor es zu tun :) – Chii

+0

Meine Absicht, eine Vorlage zu machen war und dann wieder mit mit JSON so die resultierenden HTML eingefügt werden könnten. Ich wollte die Logik in einem Service kapseln, fand aber, dass das manuelle Zurückgeben des JSON in jedem Controller genauso gut funktioniert und g.render bereits verfügbar ist. Vielen Dank für Ihre Anregungen. – aasukisuki

+0

Es hat auch ein anderes Problem ... Es ist schwieriger Komponententests für die Dienste zu erstellen, wenn sie vom Controller abhängen. – luiscolorado

4

Mein Rat wäre, dies in der Steuerung zu tun. Der Dienst sollte eine wiederverwendbare Logik haben und nicht von einer Ansichtsvorlage abhängen. Überlassen Sie diese Aufgabe dem Controller. Verwenden Sie den Dienst, um die Daten zu erhalten, die Sie an die Vorlage übergeben müssen, überlassen Sie jedoch die Interaktion mit der Vorlage dem Controller.

+1

Sorry, aber selbst wenn deine Antwort ein guter Rat ist, ist es keine akzeptable Antwort: Es gibt Wege, um zu erreichen, was gefragt wurde, auch wenn es nicht empfohlen wird. – Guillaume

3

Hier ist eine Lösung, die auf Stefan's ähnlich ist, aber ein bisschen einfacher

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 
    } 
} 
13

Es ist auch jetzt einfacher in Grails 2 mit dem PageRenderer. zB:

class SomeService { 
    def groovyPageRenderer 

    void someMethod() { 
     String html = groovyPageRenderer.render(view: '/email/someTemplateName') 
    } 
} 

API - http://grails.org/doc/latest/api/grails/gsp/PageRenderer.html

vollständigeres Beispiel - http://mrhaki.blogspot.com/2012/03/grails-goodness-render-gsp-views-and.html

+0

fast Ihre Antwort verpasst, danke für das Hinzufügen. sieht jetzt glatt aus mit neuen Grails – moeTi

+0

Einfach und einfach. Aber [Stefan's] (http://stackoverflow.com/questions/1777640/using-g-render-in-a-grails-service/1778991#1778991) Antwort Angebot Lösung für jedes Tag. Vielen Dank ;) – IgniteCoders

Verwandte Themen