【问题标题】:Grails findBy returns (unsaved) object causing null issue with render()Grails findBy 返回(未保存的)对象导致渲染()出现空问题
【发布时间】: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


【解决方案1】:

获得 ByteArrayOutputStream 后,您可以调用 toByteArray() 来获取 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)

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

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多