2012-04-25 42 views
2

XML模板过早结束:播放框架2.0:“Errorjava.lang.RuntimeException:org.xml.sax.SAXParseException; LINENUMBER:1;得到columnnumber:1;文件

@(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; 
    } 

Web服务:

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; 。文件过早结束书籍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) 
+0

错误的意思是,SAXParser得到一个空字符串来解析XML。请显示Stacktrace。 – 2012-04-26 15:06:31

+0

堆栈跟踪添加到问题! – 2012-04-26 15:42:06

+0

原来,response.body是一个空字符串。我很困惑,这是因为看着http请求。正文中有数据。 – 2012-04-27 15:52:06

回答

1

纠正我,如果我错了,但它看起来不像你是从服务中返回你的xml文件!?而是你返回“我工作”,哪些原因不会解析为xml,解析器将抛出异常

+0

该服务预计将返回Content-Type文本/纯文本。所以没有XML解析的响应。我认为它必须处理Document doc = response.asXml();如果我删除了这行代码,则没有运行时异常。并且服务返回“我工作” – 2012-04-25 21:29:28

0

在您拨打的服务中,通过WS,外部URL(MAIN_URL),并使用上线回应:

Document doc = response.asXml(); 

的错误意味着您呼叫的服务(MAIN_URL)没有返回XML。

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

0

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

相关问题