在我的grails项目中,我正在使用PDF插件。为此,我使用以下链接生成PDF:
<g:pdfLink class="pdf" pdfController="patient" pdfAction="privacyPolicy" pdfId="${patientInstance?.id}" ><g:message code="patient.generatePrivacy" /></g:pdfLink>
privacyPolicy()
方法如下:
def privacyPolicy(Long id){
def patientInstance = Patient.get(id)
if (!patientInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'patient.label', default: 'Patient'), id])
redirect(action: "list")
return
}
if(patientInstance.cf.equals("")) {
flash.message = message(code: 'cf.not.present.message', args: [message(code: 'patient.label', default: 'Patient'), id])
redirect(action: "list")
return
}
[patientInstance: patientInstance]
}
gsp页面有两个变量定义如下:
<g:set var="birthdate" value="${PatientController.getDateFromFiscalCode(patientInstance?.cf)}" />
<g:set var="cityName" value="${PatientController.getBirthplaceFromFiscalCode(patientInstance?.cf)}"/>
这两个变量都依赖于cf
,patientInstance
可能不存在
在调试模式下分析流程(当cf为空时),我注意到privacyPolicy()
被调用了两次。第一次进入第二次if,但然后它首先进入if。
控制台中的错误如下:
ERROR pdf.PdfService - org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1;
there was a problem with PDF generation java.lang.NullPointerException: Cannot get property 'length' on null object
我认为这取决于gsp变量,但我不知道如何管理它们是空的还是null(在这种情况下它们等于&#34;&#34;)
有什么建议吗?
答案 0 :(得分:1)
而是定义birthdate
&amp;通过调用控制器方法在gsps中cityName
,只需将它们作为模型值传递。
喜欢你的控制器:
def privacyPolicy(Long id){
def patientInstance = Patient.get(id)
if (!patientInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'patient.label', default: 'Patient'), id])
redirect(action: "list")
return
}
if(patientInstance.cf.equals("")) {
flash.message = message(code: 'cf.not.present.message', args: [message(code: 'patient.label', default: 'Patient'), id])
redirect(action: "list")
return
}
[patientInstance: patientInstance, birthdate: getDateFromFiscalCode(patientInstance.cf),
cityName: getBirthplaceFromFiscalCode(patientInstance.cf)]
}
以gsp中使用的方式使用控制器可能有效,但不符合标记。