Я получаю сообщение об ошибке при попытке создать PDF. Я использовал Itext PDF для создания PDF. Я получил следующую ошибку в консоли sts3.
Ошибка:
com.itextpdf.text.DocumentException: java.lang.NullPointerException
at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:821)
at com.itextpdf.text.Document.add(Document.java:277)
at com.doller.flightreservation.util.PDFGenerator.generateItinerary(PDFGenerator.java:28)
at com.doller.flightreservation.services.ReservationServiceImpl.bookFlight(ReservationServiceImpl.java:59)
at com.doller.flightreservation.controllers.ReservationController.completeReservation(ReservationController.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:438)
И мой файл PDF сохранен с 0 байтами с правильным именем. Но я получаю другой именованный файл Itiniarary.pdf с пустым файлом и файл не открывается.
Я поделился своим кодом ниже:
PDFGenerator. java
package com.doller.flightreservation.util;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import org.springframework.stereotype.Component;
import com.doller.flightreservation.entities.Reservation;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
@Component
public class PDFGenerator {
public void generateItinerary(Reservation reservation, String filePath) {
Document document = new Document();
try {
PdfWriter.getInstance(document, new FileOutputStream(filePath));
document.open();
document.add(generateTable(reservation));
document.close();
} catch (FileNotFoundException | DocumentException e) {
e.printStackTrace();
}
}
private PdfPTable generateTable(Reservation reservation) {
PdfPTable table = new PdfPTable(2);
PdfPCell cell;
cell = new PdfPCell(new Phrase("Flight Itinerary"));
cell.setColspan(2);
table.addCell(cell);
cell = new PdfPCell(new Phrase("Flight Details"));
cell.setColspan(2);
table.addCell(cell);
table.addCell("Airlines ");
table.addCell(reservation.getFlight().getOperatingAirlines());
table.addCell("Departure City");
table.addCell(reservation.getFlight().getDepartureCity());
table.addCell("Arrival City");
table.addCell(reservation.getFlight().getArrivalCity());
table.addCell("Flight Number");
table.addCell(reservation.getFlight().getFlightNumber());
table.addCell("Departure Date");
table.addCell(reservation.getFlight().getDateOfDeparture().toString());
table.addCell("Departure Time");
table.addCell(reservation.getFlight().getEstimatedDepartureTime().toString());
cell = new PdfPCell(new Phrase("Passenger Details"));
cell.setColspan(2);
table.addCell(cell);
table.addCell("First Name");
table.addCell(reservation.getPassenger().getFirstName());
table.addCell("Last Name");
table.addCell(reservation.getPassenger().getLastName());
table.addCell("Email");
table.addCell(reservation.getPassenger().getEmail());
table.addCell("Phone");
table.addCell(reservation.getPassenger().getPhone());
return null;
}
}
EmailUtil. java
package com.doller.flightreservation.util;
import java.io.File;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
@Component
public class EmailUtil {
@Autowired
private JavaMailSender sender;
public void sendItinerary(String toAddress, String filePath) {
MimeMessage message = sender.createMimeMessage();
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setTo(toAddress);
messageHelper.setSubject("Itinerary for your Flight");
messageHelper.setText("Please find your Itinerary attached.");
messageHelper.addAttachment("Itinearary", new File(filePath));
sender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
ReservationServiceImpl. java
package com.doller.flightreservation.services;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.doller.flightreservation.dto.ReservationRequest;
import com.doller.flightreservation.entities.Flight;
import com.doller.flightreservation.entities.Passenger;
import com.doller.flightreservation.entities.Reservation;
import com.doller.flightreservation.repos.FlightRepository;
import com.doller.flightreservation.repos.PassengerRepository;
import com.doller.flightreservation.repos.ReservationRepository;
import com.doller.flightreservation.util.EmailUtil;
import com.doller.flightreservation.util.PDFGenerator;
@Service
public class ReservationServiceImpl implements ReservationService {
@Autowired
FlightRepository flightRepository;
@Autowired
PassengerRepository passengerRepository;
@Autowired
ReservationRepository reservationRepository;
@Autowired
PDFGenerator pdfGenerator;
@Autowired
EmailUtil emailUtil;
@Override
public Reservation bookFlight(ReservationRequest request) {
// Make Payment
Long flightId = request.getFlightId();
Flight flight = flightRepository.findById(flightId).get();
Passenger passenger = new Passenger();
passenger.setFirstName(request.getPassengerFirstName());
passenger.setLastName(request.getPassengerLastName());
passenger.setPhone(request.getPassengerPhone());
passenger.setEmail(request.getPassengerEmail());
Passenger savedPassenger = passengerRepository.save(passenger);
Reservation reservation = new Reservation();
reservation.setFlight(flight);
reservation.setPassenger(savedPassenger);
reservation.setCheckedIn(false);
Reservation savedReservation = reservationRepository.save(reservation);
String filePath = "C:/Users/dolow/OneDrive/" + "doller_reservation_pdfs_"
+ savedReservation.getId() + ".pdf";
pdfGenerator.generateItinerary(savedReservation, filePath);
emailUtil.sendItinerary(passenger.getEmail(), filePath);
System.out.println(filePath);
return savedReservation;
}
}