2016-03-25 7 views
0

Ich versuche, eine GSP-Vorlage als PDF zu rendern und per E-Mail, aber ich bin in ein seltsames Problem läuft. Früher habe ich Grails findBy* Methode, um meine Daten zu erhalten,Grails findBy returns (ungespeichert) Objekt verursacht null Problem mit render()

def fax(Integer id) { 
    def transcriptInstance = Transcript.findById(id) 
    def userInstance = User.findById(transcriptInstance.submitter) 

    def m = [userInstance: userInstance, transcriptInstance: transcriptInstance] 

    ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/transcript/_pdf", model: m) 

    mailService.sendMail { 
     to <my email> // for testing 
     from <my email> // for testing 
     subject "PDF Attachment"; 
     attachBytes "transcript.pdf", "application/pdf", bytes.toByteArray() 
     body "PDF attachment" 
    } 
} 

aber der Benutzer-Instanz zurückgibt als User : (unsaved) und ich erhalte den Fehler Cannot invoke method render() on null object auf der Linie ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/transcript/_pdf", model: m). Der Benutzer ist definitiv in der Datenbank gespeichert und dies ist das erste Mal, dass ich darüber gestoßen bin. Irgendeine Idee, was schief läuft?

EDIT:

Dieser Code erzeugt nun ein pdf, aber ich kann es nicht über das Mailservice senden bekommen.

def fax(Integer id) { 
    def transcriptInstance = Transcript.findById(id) 
    def userInstance = User.findById(transcriptInstance.submitter) 

    def m = [userInstance: userInstance, transcriptInstance: transcriptInstance] 

    ByteArrayOutputStream pdfBytes = pdfRenderingService.render(template: '/transcript/pdf', model: m) 
    new File('test.pdf').withOutputStream { 
     it.write pdfBytes.toByteArray() 
    } 

    mailService.sendMail { 
     multipart true 
     to <my email> // for testing 
     from <my email> // for testing 
     subject "PDF Attachment"; 
     attachBytes "transcript.pdf", "application/pdf", <WHAT DO I PUT HERE?> 
     body "PDF attachment" 
    } 
} 

Ich habe ein paar Dinge in der Stelle versucht, aber nichts funktioniert. Irgendwelche Ideen?

+0

Ist das Benutzerinstanz nicht gespeichert, wenn Sie 'User.findById (transcriptInstance.submitter) ausführen' oder es später nicht gespeichert werden? (vielleicht wird es verschmutzt zB in 'pdfRenderingService.render()') –

+0

Der Benutzer wird gespeichert und in der Datenbank zum Zeitpunkt '.findById()'. Ich kann auf alle Felder, die ich debuggen möchte, mit 'println 'userInstance id:" + userInstance.id "zugreifen. – mjswartz

+0

Ich glaube, es könnte ein Problem von mir sein, 'pdfRenderingService' nicht korrekt zu instanziieren. Benötige ich einen spezifischen Import an der Oberseite des Controllers? Ich habe 'def pdfRenderingService' außerhalb aller Aktionen und' compile "org.grails.plugins: rendering: 1.0.0" innerhalb von BuildConfig.groovy – mjswartz

Antwort

0

Sobald Sie Ihren ByteArrayOutputStream haben, können Sie toByteArray() aufrufen, um die vom MailService benötigten Bytes zu erhalten.

def fax(Integer id) { 
    def transcriptInstance = Transcript.findById(id) 
    def userInstance = User.findById(transcriptInstance.submitter) 

    def m = [userInstance: userInstance, transcriptInstance: transcriptInstance] 

    ByteArrayOutputStream pdfBytes = pdfRenderingService.render(template: '/transcript/pdf', model: m) 

    mailService.sendMail { 
     multipart true 
     to <my email> // for testing 
     from <my email> // for testing 
     subject "PDF Attachment"; 
     attachBytes "transcript.pdf", "application/pdf", pdfBytes.toByteArray() 
     body "PDF attachment" 
    } 
}