2011-04-20 97 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

希望它有帮助!