实际上我正在创建一个使用JSF上传文件的应用程序。但每当我上传文件并点击发送时,它都会显示NullPointerException
。我用于该应用程序的代码是:
使用Tomahawk的JSF代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Email Client Web Application</title>
</head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="3" id="basePanel" rules="rows" border="0">
<h:outputLabel>TO:</h:outputLabel>
<h:inputText id="txtTo" size="50" required="true"
requiredMessage="Recipient cannot be empty"
value="#{MailSenderBean.to}">
<f:validator
validatorId="userLibrary.validators.DefaultRecipientValidator" />
</h:inputText>
<h:message for="txtTo" style="color:red"></h:message>
<h:outputLabel>CC:</h:outputLabel>
<h:inputText id="txtCC" size="50" value="#{MailSenderBean.cc}">
<f:validator
validatorId="userLibrary.validators.DefaultRecipientValidator" />
</h:inputText>
<h:message for="txtCC" style="color:red"></h:message>
<h:outputLabel>BCC:</h:outputLabel>
<h:inputText id="txtBCC" size="50" value="#{MailSenderBean.bcc}">
<f:validator
validatorId="userLibrary.validators.DefaultRecipientValidator" />
</h:inputText>
<h:message for="txtBCC" style="color:red"></h:message>
<h:outputLabel>SUBJECT:</h:outputLabel>
<h:inputText id="txtSubject" size="92"
value="#{MailSenderBean.subject}"></h:inputText>
<h:message for="txtSubject"></h:message>
<h:outputLabel></h:outputLabel>
<h:inputTextarea id="txtMessage" rows="10" cols="70"
value="#{MailSenderBean.messageBody}"></h:inputTextarea>
<h:message for="txtMessage"></h:message>
</h:panelGrid>
<div id="part2" style="position:fixed;left:85px">
<t:inputFileUpload id="file" value="#{MailSenderBean.uploadedFile}"></t:inputFileUpload>
<h:message for="file" style="color: red;" />
<br><br>
<h:commandButton id="btnSubmit" value="Send" action="#{MailSenderBean.send}"></h:commandButton>
</div>
</h:form>
java文件的代码:
public String send() {
System.out.println("File type: " + uploadedFile.getContentType());
System.out.println("File name: " + uploadedFile.getName());
System.out.println("File size: " + uploadedFile.getSize() + " bytes");
String status = "fail";
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("saikia.buddha",
"b10Q@`z&0%");
}
});
try {
Message message = new MimeMessage(session);
MimeBodyPart part1=new MimeBodyPart();
MimeBodyPart part2=new MimeBodyPart();
FileDataSource datasource=new FileDataSource((File) uploadedFile);
message.setFrom(new InternetAddress("saikia.buddha@gmail.com",
"BUDDHA SAIKIA"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(getTo()));
message.setRecipients(Message.RecipientType.CC,
InternetAddress.parse(getCc()));
message.setRecipients(Message.RecipientType.BCC,
InternetAddress.parse(getBcc()));
message.setSubject(getSubject());
part1.setText(messageBody);
part2.setDataHandler(new DataHandler(datasource));
try {
part2.attachFile(datasource.getFile());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(part1);
multipart.addBodyPart(part2);
message.setContent(multipart);
Transport.send(message);
status = "success";
} catch (MessagingException e) {
throw new RuntimeException(e);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return status;
}
stacktrace:
javax.faces.el.EvaluationException: org.apache.jasper.el.JspELException: /index.jsp(50,2) '#{MailSenderBean.send}' java.lang.NullPointerException
at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:96)
at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:100)
at javax.faces.component.UICommand.broadcast(UICommand.java:120)
at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:937)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:271)
at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1249)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:675)
at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.jasper.el.JspELException: /index.jsp(50,2) '#{MailSenderBean.send}' java.lang.NullPointerException
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:79)
at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:88)
... 26 more
Caused by: java.lang.NullPointerException
at userLibrary.MailSender.send(MailSender.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:70)
... 27 more
答案 0 :(得分:3)
<h:form>
根据Tomahawk文档,您忘记将表单enctype
设置为multipart/form-data
。
相应修复:
<h:form enctype="multipart/form-data">
不要忘记在ExtensionsFilter
中配置web.xml
,以便JSF可以处理上传的文件和所有其他属性以及操作。当前堆栈跟踪中缺少此过滤器。
请注意,您在操作方法中隐含地期望uploadedFile
不是null
。您可能希望将required="true"
添加到<t:inputFileUpload>
组件,否则当有人未选择文件时,您将再次获得NullPointerException
。
答案 1 :(得分:0)
在我看来,你在EL表达式中提供了错误的bean名称。 bean名称的第一个字符应为小写。例如,如果您将托管bean声明为public class MrBean
,则应将其称为mrBean
。