2014-07-06 30 views
0

在我的grails项目中,我使用PDF插件。为此,我使用下面的链接生成PDF:grails g:在gsp页面中设置为空值

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

} 

普惠制页面已经得到了定义两个变量如下:

<g:set var="birthdate" value="${PatientController.getDateFromFiscalCode(patientInstance?.cf)}" /> 
<g:set var="cityName" value="${PatientController.getBirthplaceFromFiscalCode(patientInstance?.cf)}"/> 

这两个变量都依赖于cf,这可能不存在一个patientInstance

在调试模式下(当cf为空时)分析流程,我注意到privacyPolicy()被调用两次。第一次进入第二次,但如果进入第一次。

在控制台中的错误是:

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变量,但我不知道如何当他们是空或空(在这种情况下,他们是平等的管理“”)

有什么建议吗?

回答

1

相反定义birthdate & cityName在gsps中通过调用controller方法,只是将它们作为模型值传递。

就像在你的控制器:

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使用可能工作,但没有达到标准的方式控制。

+0

第二,如果给我一些问题......事实上,它只适用于我评论它...如果我使用它,我有上面的相同的例外,并显示消息代码与冷杉相关如果(default.not。 found.message) – FrancescoDS

+0

我希望如果cf为空,用户可以看到另一个错误消息(cf.not.present.message)。那么,为什么这个检查会给出一个错误? – FrancescoDS

+0

是的,你应该得到'NullPointerException'(NPE)。由于你的'cf'可以为null或空,那么访问'equals'方法可能会失败。因此,如果仅仅用条件:'if(!patientInstance.cf){}'来代替。由于在groovy中,空值/空字符串/ 0 /假/空列表被视为假条件。所以这会起作用。 –