2012-04-25 43 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--我不知道這適用於您的特定情況。

相關問題