以下是包含堆栈跟踪的代码:https://gist.github.com/2649430
我有2个java类。一种是合并多个PDF并返回生成的合并PDF的字节数组,然后另一个是在servlet上提供结果PDF字节数组。当我运行服务器时,我收到此错误:
java.lang.NullPointerException
at java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:106)
at testPackage.TestServlet.doGet(TestServlet.java:37)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
(完整的堆栈跟踪包含在gist链接中)
你能帮我解决一下如何做到这一点吗?
UPDATE :trutheality指出mergePDF()不会被调用。所以我更新了文件TestServlet.java:
public class TestServlet extends HttpServlet {
private static byte[] PDF;
public static void mergePDF() {
try {
List pdfs = new ArrayList();
pdfs.add(new FileInputStream("/test.pdf"));
pdfs.add(new FileInputStream("/test2.pdf"));
ByteArrayOutputStream output = new ByteArrayOutputStream();
PDF = PDFMerger.concatPDFs(pdfs, output, true);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
mergePDF();
InputStream is = new ByteArrayInputStream(PDF);
// Set response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/pdf");
response.setContentLength(PDF.length);
OutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
os.flush();
os.close();
}
}
仍然没有解决问题:
root cause java.lang.NoClassDefFoundError: com/itextpdf/text/pdf/PdfTemplate testPackage.TestServlet.mergePDF(TestServlet.java:28) testPackage.TestServlet.doGet(TestServlet.java:37) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) root cause java.lang.ClassNotFoundException: com.itextpdf.text.pdf.PdfTemplate org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) testPackage.TestServlet.mergePDF(TestServlet.java:28) testPackage.TestServlet.doGet(TestServlet.java:37) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
UPDATE2 :
谢谢@mprabhat和@Zhanger,我从here下载了iText zip并将其放入项目中。它只为我提供了这些jar:itextpdf-5.2.1.jar, itextpdf-5.2.1-javadoc.jar, itextpdf-5.2.1-sources.jar, itextpdf-xtra-5.2.1.jar, itextpdf-xtra-5.2.1-javadoc.jar, itextpdf-xtra-5.2.1-sources.jar
你认为对吗?
奇怪的是,如果我将合并的PDF写入文件而不是将其存储为字节数组,那么一切正常......
答案 0 :(得分:1)
您的堆栈跟踪在您的代码中是不言自明的
InputStream is = new ByteArrayInputStream(PDF);
作为doGet
实现的一部分,当您传递byte[] PDF
它尚未初始化时,它的空值因此是NPE。
答案 1 :(得分:1)
正如所提到的那样,似乎永远不会调用mergePDF()
,所以你可能应该将它放在static initializer中(这样每次发出GET请求时都不会调用它,而是只有一次,提高效率/页面加载时间)
static {
mergePDF();
}
HttpServlet
中的。
至于你的其他问题,似乎无法找到所需的依赖关系。也许检查.jars是否在正确的位置/目录?
答案 2 :(得分:1)
宾果!
谢谢@Zhanger和@mprabhat,这是所有愚蠢的RUNTIME路径。所以我通过将iText jar放在项目的WEB-INF/lib
中来解决这个问题。现在就行!