0

问题如下:

在运行异常的 webapp 中发送邮件时,Play framework 1.2.4可以在日志中观察到以下堆栈跟踪:

Execution exception 
NullPointerException occured : null 

play.exceptions.JavaExecutionException 
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231) 
        at Invocation.HTTP Request(Play!) 
Caused by: java.lang.NullPointerException 
        at play.exceptions.MailException.<init>(MailException.java:27) 
        at play.libs.Mail.buildMessage(Mail.java:79) 
        at play.libs.Mail.send(Mail.java:35) 
        at play.mvc.Mailer.send(Mailer.java:347) 
        at play.mvc.Mailer.sendAndWait(Mailer.java:355) 
        at notifiers.Mails.forgotPassword(Mails.java:19) 
        at controllers.PasswordReset.requestPasswordReset(PasswordReset.java:102) 
        at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548) 
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502) 
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478) 
        at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473) 
        at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161) 
        ... 1 more 

这里的相关部分如下:

Caused by: java.lang.NullPointerException 
        at play.exceptions.MailException.<init>(MailException.java:27) 

这表明这是从(第 27 行)NullPointerException的构造函数中抛出的。play.exceptions.MailException此构造函数的源代码如下所示:

public MailException(String message, Throwable cause) {
    super(message, cause);
    StackTraceElement element = getInterestingStrackTraceElement(cause);
    if(element != null) {
        ApplicationClass applicationClass = Play.classes.getApplicationClass(element.getClassName());
        sourceFile = applicationClass.javaFile.relativePath(); // this line is 27th and NPE is thrown from here
        source = Arrays.asList(applicationClass.javaSource.split("\n"));
        line = element.getLineNumber();
    }
}

所以applicationClass局部变量或javaFile属性都为空。熟悉Play framework奇怪内部结构的人可以建议导致此问题的原因吗?

非常感谢提前

Seb Cesbron回答后编辑

我们还检查play.libs.Mail.buildMessage(Mail.java:79)了清楚地看到from地址为空的地方,但在修复之后,弹出了类似的异常:

play.exceptions.JavaExecutionException
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.NullPointerException
    at play.exceptions.MailException.<init>(MailException.java:27)
    at play.mvc.Mailer.send(Mailer.java:349)
    at play.mvc.Mailer.sendAndWait(Mailer.java:355)
    at notifiers.Mails.forgotPassword(Mails.java:19)
    at controllers.PasswordReset.requestPasswordReset(PasswordReset.java:102)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)

在那里,play.mvc.Mailer.send方法包含近 200 行代码,包含在try-catch块中,因此找出问题所在非常棘手:)

4

1 回答 1

1

Mail.java 中的第 79 行引用了 throw MailException,因为没有发件人地址。

MailException 中的 NullPointerException 似乎表明没有与您的邮件关联的文件。您确定文件 Mails/forgotPassword.html(或 txt)存在吗?

于 2012-11-14T07:40:42.040 回答