Play Framework 2.0:“Errorjava.lang.RuntimeException:org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1;文件过早结束

时间:2012-04-25 20:06:51

标签: java playframework-2.0

Xml模板:

@(product: models.Product, productComponents: List[models.ProductComponent])
<product>
  <name>@product.name</name>
  <tomcatLocation>@product.tomcatLocation</tomcatLocation>
  <productComponents>
    @for(productComponent <- productComponents) {
     <component>
       <name>@productComponent.name</name>
       <packageName>@productComponent.packageName</packageName>
       <buildPath>@productComponent.buildPath</buildPath>
       <packageFormat>@productComponent.packageFormat</packageFormat>
       <versionAction>@productComponent.versionAction</versionAction>
       <versionFilePath>@productComponent.versionFilePath</versionFilePath>
       <versionCommand>@productComponent.versionCommand</versionCommand>
     </component>
    }
  </productComponents>
</product>

控制器操作:

public static Result upgradeProduct(String serverId, String productId) throws InterruptedException
  {
      models.Server server = models.Server.retrieveById(Long.parseLong(serverId));
      models.Product product = models.Product.retrieveById(Long.parseLong(productId));

      List<models.ProductComponent> productComponents = 
              models.ProductComponent.retrieveByProductId(Long.parseLong(productId));

      Xml renderedXmlPage = upgradeService.render(product, productComponents);

      Promise<WS.Response> upgradeStatus = 
              WS.url("http://" + server.hostIp + ":8085/upgradeProduct").setHeader("Content-Type", "text/xml").post(
                      renderedXmlPage.toString());

      String testMessage = upgradeStatus.get().getBody();

      return TODO;
  }

网络服务:

public static Result upgradeProduct()
{
  return async( WS.url(MAIN_URL).get().map(
          new Function<WS.Response, Result>() {
            public Result apply(WS.Response response)
            {
                try
                {
                    Document doc = response.asXml();
                    return ok("I WORKED");
                }
                catch(RuntimeException e)
                {
                    return ok("Error" + e.getMessage()+ "\n");
                }

            }
          })
        );
}

当我运行此操作时,抛出以下运行时异常

  

“Errorjava.lang.RuntimeException:org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1;文件过早结束。”

在“Document doc = response.asXml();”中抛出此异常。我不知道为什么会这样?非常感谢任何帮助!

Stack Trace: 
play.libs.WS$Response.asXml(WS.java:332)
controllers.Service$1.apply(Service.java:40)
controllers.Service$1.apply(Service.java:35)
play.libs.F$Promise$2.apply(F.java:111)
play.api.libs.concurrent.STMPromise$$anonfun$map$1$$anonfun$apply$9.apply(Promise.scala:185)
scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:110)
scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:110)
scala.util.control.Exception$Catch.apply(Exception.scala:88)
scala.util.control.Exception$Catch.either(Exception.scala:110)
play.api.libs.concurrent.STMPromise.redeem(Promise.scala:166)
play.api.libs.concurrent.STMPromise$$anonfun$map$1.apply(Promise.scala:185)
play.api.libs.concurrent.STMPromise$$anonfun$map$1.apply(Promise.scala:184)
play.api.libs.concurrent.STMPromise$PromiseInvoker$$anonfun$receive$1.apply(Promise.scala:10    4)
play.api.libs.concurrent.STMPromise$PromiseInvoker$$anonfun$receive$1.apply(Promise.scala:10    3)
akka.actor.Actor$class.apply(Actor.scala:290)
play.api.libs.concurrent.STMPromise$PromiseInvoker.apply(Promise.scala:101)
akka.actor.ActorCell.invoke(ActorCell.scala:617)
akka.dispatch.Mailbox.processMailbox(Mailbox.scala:179)
akka.dispatch.Mailbox.run(Mailbox.scala:161)
akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:505)
akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:997)
akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1495)
akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)

3 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我,但看起来你没有从服务中返回你的xml文件!?相反,你返回“我工作”,其原因不会解析为xml,解析器将抛出异常。

答案 1 :(得分:0)

在您通过WS呼叫的服务中,使用外部网址(MAIN_URL)并在线使用回复:

Document doc = response.asXml();

错误表示您正在调用的服务(MAIN_URL)未返回XML。

顺便说一句,你的控制器有TODO作为返回值,我不确定那里是否你想要的东西,因为你似乎在控制器中有工作代码。

答案 2 :(得分:0)

除了明显没有任何XML输入的情况之外,有时在您的代码第二次尝试阅读javax.xml.transform.Sourcejavax.xml.transform.sax.SAXSource时,此错误也会被抛出。第一次一切运行正常,但第二次消耗了字节并且你得到了那个例外。至少我是如何遇到它的,在这种情况下我只是简单地创建Source - 我不知道这是否适用于你的具体情况。