我使用glassfish服务器4.1javaJDK1.8。我使用maven来构建和部署。
我制作了一个表单,触发控制器使用gmail api发送电子邮件。
触发控制器的表单:
<form method="post" action=GmailController>
<td>Test API gmail</td>
<td><input name="email" value="${requestScope.get("email")}" /></td>
<td><input type="submit" value="Send email" /></td>
</form>
控制器“GmailController”:
@WebServlet("/GmailController")
public class GmailController extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String email = request.getParameter("email");
try {
sendAnEmail("email_body", email, email); //custom method that uses gmail API
} catch (Exception e) {
e.printStackTrace();
}
}
}
调用GMail的sendAnEmail方法API函数:
public static void sendAnEmail(String body, String from, String to) throws Exception {
Gmail service = getGmailService();
MimeMessage msg = createEmail(to, from, "Area", body);
sendMessage(service, "email@example.com", msg);
}
当我提交触发控制器的表单时,我收到HTTP500错误,glassfish显示:
java. lang.VerifyError:无法从最终类继承
当我在我的javaglassfish网络应用程序之外测试GMailAPI时,它通过在java中调用sendAnEmail
来正常工作。
我不明白是什么导致了这个错误,因为我的类不会继承自任何其他类,除了HttpServlet
。
当我注释sendAnEmail()
调用时,没有错误,所以bug一定不是因为HttpServlet
继承。
什么会导致此错误?如何调试或获取有关它的更多信息?
在server. log中,我没有获得更多信息,它显示相同的错误并告诉线程已停止。
经过一些测试,在另一台计算机上的完全相同的代码和OS给出:
com.google. api.client.util.ClassInfo.getFieldInfos()Ljava/util/Collection;
相反。
google-api-services-oaut2、google-api-services-gmail和google-api-client都是1.23.0版本。
错误:java. lang.VerifyError:无法从最终类继承
基于此线程,您已经设法创建了一个扩展超类的类,其中超类已声明为最终
。
最有可能的原因是您的构建类路径和启动类路径之间存在冲突。换句话说,您正在针对不是last
的超类版本编译子类,然后针对last
的版本运行。验证者说(正确地)这是错误的。
错误:com.google. api.client.util.ClassInfo.getFieldInfos()Ljava/util/Collection;
基于此论坛,您的代码正在(间接)调用一个不存在的方法。检查您在类路径中使用的依赖项。
希望这有帮助!