Scala/Java POST 请求第一次成功,然后 NULL ptr 异常错误
Scala/Java POST request works first time, then NULL ptr exception error
我在我的 servlet 中 运行 请求,它在我第一次 运行 时运行良好。以下实例不起作用。我收到 500 错误(Nullptr 异常)。
我必须重新启动服务器才能再次工作。
这是我的post请求代码,很简单:
def getResp(resp: HttpServletResponse, msg: String )
{
val out: PrintWriter = resp.getWriter()
out.println(msg)
}
override def doPost(request: HttpServletRequest, response: HttpServletResponse) = {
response.setHeader("Access-Control-Allow-Origin", "*")
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
response.setHeader("Access-Control-Max-Age", "3600")
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, content-type")
getResp(response, createFile(request.getReader.readLine()))
}
下面是根据 post 请求中给定的数据创建文件的代码:
val document = new PDDocument()
sealed trait Value
case class value1(subval: String) extends Value
case class value2(`trait`: Int) extends Value
implicit val formats = Serialization.formats(NoTypeHints) +
new newSerializer
object newSerializer extends CustomSerializer[Value](format => ({
case JString(newT) => value1(newT)
case JInt(newZ) => value2(newZ.toInt)
}, {
case value1(v1) => JString(v1)
case value2(v2) => JInt(v2)
}))
def createFile(json: String): String = {
val myJSON = parse(json).extract[Value]
val blankPage: PDPage = new PDPage()
val contentStream = new PDPageContentStream(document, blankPage)
////DO SOMETHING....THEN:
str = "/path/"
try {
document.save(str)
}
finally {
document.close()
}
str
这是输出:
java.lang.NullPointerException
org.apache.pdfbox.pdmodel.common.PDStream.<init>(PDStream.java:71)
org.apache.pdfbox.pdmodel.edit.PDPageContentStream.<init>(PDPageContentStream.java:258)
org.apache.pdfbox.pdmodel.edit.PDPageContentStream.<init>(PDPageContentStream.java:173)
org.apache.pdfbox.pdmodel.edit.PDPageContentStream.<init>(PDPageContentStream.java:158)
com.pdf.FileServlet.createFile(FileServlet.scala:142)
com.pdf.FileServlet.doPost(FileServlet.scala:78)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
如果您有任何建议或建议,那将非常有帮助。我不知道如何进行,对问题可能出在哪里一无所知。一开始能用,后来就不行了,这让我很奇怪。
非常感谢!
您的问题是您只创建了一次 document
对象,但是您向它写入并在每次请求时 close
它。通常,具有 close
方法的对象在 close
方法被调用后不能被重用。
只需将您的 val document = new PDDocument()
声明移动到您声明 blankPage
的位置,以便为每个请求创建一个新文档。
我在我的 servlet 中 运行 请求,它在我第一次 运行 时运行良好。以下实例不起作用。我收到 500 错误(Nullptr 异常)。
我必须重新启动服务器才能再次工作。
这是我的post请求代码,很简单:
def getResp(resp: HttpServletResponse, msg: String )
{
val out: PrintWriter = resp.getWriter()
out.println(msg)
}
override def doPost(request: HttpServletRequest, response: HttpServletResponse) = {
response.setHeader("Access-Control-Allow-Origin", "*")
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
response.setHeader("Access-Control-Max-Age", "3600")
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, content-type")
getResp(response, createFile(request.getReader.readLine()))
}
下面是根据 post 请求中给定的数据创建文件的代码:
val document = new PDDocument()
sealed trait Value
case class value1(subval: String) extends Value
case class value2(`trait`: Int) extends Value
implicit val formats = Serialization.formats(NoTypeHints) +
new newSerializer
object newSerializer extends CustomSerializer[Value](format => ({
case JString(newT) => value1(newT)
case JInt(newZ) => value2(newZ.toInt)
}, {
case value1(v1) => JString(v1)
case value2(v2) => JInt(v2)
}))
def createFile(json: String): String = {
val myJSON = parse(json).extract[Value]
val blankPage: PDPage = new PDPage()
val contentStream = new PDPageContentStream(document, blankPage)
////DO SOMETHING....THEN:
str = "/path/"
try {
document.save(str)
}
finally {
document.close()
}
str
这是输出:
java.lang.NullPointerException
org.apache.pdfbox.pdmodel.common.PDStream.<init>(PDStream.java:71)
org.apache.pdfbox.pdmodel.edit.PDPageContentStream.<init>(PDPageContentStream.java:258)
org.apache.pdfbox.pdmodel.edit.PDPageContentStream.<init>(PDPageContentStream.java:173)
org.apache.pdfbox.pdmodel.edit.PDPageContentStream.<init>(PDPageContentStream.java:158)
com.pdf.FileServlet.createFile(FileServlet.scala:142)
com.pdf.FileServlet.doPost(FileServlet.scala:78)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
如果您有任何建议或建议,那将非常有帮助。我不知道如何进行,对问题可能出在哪里一无所知。一开始能用,后来就不行了,这让我很奇怪。
非常感谢!
您的问题是您只创建了一次 document
对象,但是您向它写入并在每次请求时 close
它。通常,具有 close
方法的对象在 close
方法被调用后不能被重用。
只需将您的 val document = new PDDocument()
声明移动到您声明 blankPage
的位置,以便为每个请求创建一个新文档。