【发布时间】:2016-03-25 15:45:56
【问题描述】:
我正在尝试将 GSP 模板呈现为 PDF 并通过电子邮件发送,但我遇到了一个奇怪的问题。我使用 Grails findBy* 方法来获取我的数据,
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"
}
}
但用户实例返回为User : (unsaved),我在ByteArrayOutputStream bytes = pdfRenderingService.render(template: "/transcript/_pdf", model: m) 行收到错误Cannot invoke method render() on null object。用户肯定保存在数据库中,这是我第一次遇到这个问题。知道出了什么问题吗?
编辑:
此代码现在生成一个 pdf,但我无法通过 mailService 发送它。
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"
}
}
我在现场尝试了一些东西,但没有任何效果。有什么想法吗?
【问题讨论】:
-
执行
User.findById(transcriptInstance.submitter)时该用户实例是否未保存或稍后未保存? (也许它在pdfRenderingService.render()中变得很脏) -
.findById()时用户已保存并在数据库中。我可以使用println "userInstance id: " + userInstance.id访问我想要调试的任何字段。 -
我相信这可能是我没有正确实例化
pdfRenderingService的问题。我需要在控制器顶部进行特定的导入吗?我在所有操作之外只有def pdfRenderingService,在 BuildConfig.groovy 中只有compile "org.grails.plugins:rendering:1.0.0" -
我不是在询问来自 db 的 userInstance 的字段,我是在询问
userInstance.isDirty() == true在哪个阶段。 -
Michal,看看我的编辑。
标签: grails grails-orm