问题
Actually I'm creating an application for uploading file using JSF. But whenever I upload a file and click send it shows NullPointerException
. The code I have used for the application is:
code for JSF using Tomahawk:
<%@ 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>
code for java file:
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;
}
The 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
回答1:
<h:form>
You forgot to set the form's enctype
to multipart/form-data
as per Tomahawk documentation.
Fix it accordingly:
<h:form enctype="multipart/form-data">
Don't forget to configure the ExtensionsFilter
in web.xml
as well so that the uploaded file and all other properties and the action can be processed by JSF. This filter is namely missing in your current stack trace.
Note that you're in the action method implicitly expecting the uploadedFile
to be not null
. You would probably like to add required="true"
to the <t:inputFileUpload>
component, otherwise you will get a NullPointerException
again when someone doesn't select a file.
See also:
- JSF 2.0 File upload (a complete mini-tutorial)
回答2:
It seems to me that you have provided the wrong name of the bean in your EL expression. The first character of the bean's name should be in lower case. For example, if you declared your managed bean as public class MrBean
, you should refer to it as mrBean
.
来源:https://stackoverflow.com/questions/8465696/how-to-upload-file-in-jsf