2011-04-20 100 views
1

我做了一個web服務,它只是簡單地顯示來自數據庫的用戶數據。但是當我運行客戶端時,我一直在獲取這個異常。在基本的webservice中獲得例外

Couldn't create SOAP message due to exception: XML reader error: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF; was expecting a close tag for element at [row,col {unknown-source}]: [1,110]

/////////////////////這是web服務代碼////////////////// //////////////

@WebMethod(operationName = 「viewUserData」)

public ArrayList viewUserData() { 
    //TODO write your implementation code here: 
    Statement stmt = null; 
    ResultSet rs = null; 
    String query = ""; 
    //ArrayList<HashMap> list = new ArrayList<HashMap>(); 
    ArrayList list = new ArrayList(); 

    try { 
     String connectionURL = "jdbc:oracle:thin:@p5"; 
     Connection connection = null; 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     connection = DriverManager.getConnection(connectionURL, "backconnect", "backconnect"); 
     query = "select * from users"; 
     stmt = connection.createStatement(); 
     rs = stmt.executeQuery(query); 

     while(rs.next()){ 
      /*HashMap<String,Object> map = new HashMap<String,Object>(); 
      map.put("USER_ID", rs.getString("USER_ID")); 
      map.put("NAME", rs.getString("NAME")); 
      map.put("SHORT_NAME", rs.getString("SHORT_NAME")); 
      map.put("PASSWORD", rs.getString("PASSWORD"));*/ 
      SetData sdata = new SetData(); 
      sdata.setUSER_ID(rs.getString("USER_ID")); 
      sdata.setNAME(rs.getString("NAME")); 
      sdata.setSHORT_NAME(rs.getString("SHORT_NAME")); 
      sdata.setPASSWORD(rs.getString("PASSWORD")); 
      /*list.add(rs.getString("USER_ID")); 
      list.add(rs.getString("NAME")); 
      list.add(rs.getString("SHORT_NAME")); 
      list.add(rs.getString("PASSWORD"));*/ 
      list.add(sdata); 
     } 
    } catch (Exception ex) { 

     System.out.println(ex.getMessage()); 
    } 
    return list; 
} 

SetData的是一個Java bean ////////// //////////這是客戶代碼///////////////////

package1.GetUserDataService service = new package1.GetUserDataService(); 
package1.GetUserData port = service.getGetUserDataPort(); 
// TODO process result here 
java.util.List<java.lang.Object> result = port.viewUserData(); 
out.println("Result = "+result); 

I我陷入了這一點。如何解決這個問題。

回答

1

我想要做的第一件事就是確定這是客戶端錯誤還是服務器錯誤。

使用FiddlerWireshark攔截客戶端到服務器的流量,並檢查SOAP請求是否有效。

你還沒有說你是否得到了客戶端或服務器端的例外本身,所以它可能是請求越來越有沒關係,但客戶端不讀響應正常。

編輯:爲了簡化事情,您可能想要暫時硬編碼一些數據。它不會外觀像問題是在數據庫代碼本身,所以通過刪除所有這些,使診斷更容易 - 只是硬編碼幾個名稱返回...你甚至可能想要改變它返回一個int,只是爲了查看問題是否在使用ArrayList

+0

在客戶端這一行上,它拋出了一個異常java.util.List result = port.viewUserData(); – 2011-04-20 05:29:01

+0

@Java_NewBie:客戶端可能會以任何方式報告錯誤,但您應該能夠看到發生了什麼並回來。 – 2011-04-20 05:32:18

+0

@Java_NewBie:除了Jon推薦:使用[soapUI](http://www.eviware.com/soapUI/soapui-products-overview.html)測試webservice - 如果* that *有效並且消息看起來不錯,然後在客戶端進行調查。 – 2011-04-20 05:54:21

1

作爲替代方案,如果您的jdbc提供程序支持,您可能希望從Web服務返回WebRowSet。 下面是一個例子

import javax.sql.rowset.WebRowSet; 
import com.sun.rowset.WebRowSetImpl; // Reference implementation 
... 
// get ResultSet rs from db 
WebRowSet webrowset = new WebRowSetImpl(); 
webrowset.populate(rs); 
// return webrowset from web service 

這樣你就可以擺脫你正在使用的SetData的java bean的。

+0

如果我能做到這一點,該怎麼辦。 > HashMap map = new HashMap(); map.put(「USER_ID」,rs.getString(「USER_ID」)); map.put(「NAME」,rs.getString(「NAME」)); 012.map.put(「SHORT_NAME」,rs.getString(「SHORT_NAME」)); map.put(「PASSWORD」,rs.getString(「PASSWORD」));然後將這個映射添加到列表中,但它仍然是一個錯誤,我試過你的解決方案,但它沒有部署。 – 2011-04-20 07:46:31

1

我遇到了同樣的問題,我解決了這個問題,在我的項目中添加了一些缺失的工件。看來,CXF是無法填補客戶端消息中的有效載荷由於這種丟失的文物:

<dependency> 
<groupId>org.apache.cxf</groupId> 
<artifactId>cxf-rt-transports-http-jetty</artifactId> 
<version>${cxf.version}</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>ezmorph</groupId> 
     <artifactId>ezmorph</artifactId> 
     <version>1.0.5</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>fife</groupId> 
     <artifactId>rsyntaxtextarea</artifactId> 
     <version>1.3.4</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-httpclient</groupId> 
     <artifactId>commons-httpclient</artifactId> 
     <version>3.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>1.0</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>bouncycastle</groupId> 
     <artifactId>bcprov-jdk15</artifactId> 
     <version>143</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>jtidy</groupId> 
     <artifactId>jtidy</artifactId> 
     <version>r820</version> 
     <scope>test</scope> 
    </dependency> 

PS:我用的單元測試類調用WS CXF版本:2.4

希望它有幫助!