【问题标题】:returning multiple values in web service在 Web 服务中返回多个值
【发布时间】:2012-04-10 09:35:41
【问题描述】:

我正在使用 java 和 eclipse 设计一个 web 服务,它返回在数据库中标记为客户的用户详细信息

我成功地使用以下代码返回了单个用户的详细信息(因为 dB 中只有一个条目):

public class GetData {

public LoginDetails getDetails(){    
    Connection conn;
    Statement stmt;
    ResultSet rs;

    try {
        LoginDetails lds=new LoginDetails();
        Class.forName(driver);
        conn=DriverManager.getConnection(url,username,password);
        stmt=conn.createStatement();
        String sql="select * from login where usertype='customer'";
        rs=stmt.executeQuery(sql);
        while(rs.next()){
            lds.setUsername(rs.getString(1));
            lds.setPassword(rs.getString(2));
            lds.setUsertype(rs.getString(3));
            lds.setActive(rs.getString(4));

        }
        return lds;
    } 
    catch(ClassNotFoundException c){
        c.printStackTrace();
    }
    catch (SQLException e) {
        e.printStackTrace();
    }

    return null;
}
}

如果有多个 dB 值符合条件并且我想全部显示,我该怎么办。请指教。

【问题讨论】:

  • 您可以返回List<LoginDetails>
  • 我只返回一个List&lt;LoginDetails&gt;LoginDetails[]。但有一件事,我认为从安全角度来看返回用户密码并不明智。
  • @beny23 是的,我只是想了解服务如何在 dB 中的现有条目上工作。这就是我返回密码的原因。我的坏:)
  • @m0skit0 我尝试使用 List 和 Collection 但它们都产生相同的结果对象引用。
  • 为每个对象创建一个新对象。你不能像现在这样重复使用同一个 (lds)。

标签: java web-services jax-rpc


【解决方案1】:

将您的方法签名更改为public LoginDetails[] getDetails()

并按如下方式扩展您的 while 循环:

    Collection<LoginDetails> details = new ArrayList<LoginDetails>();
    while(rs.next()){
        LoginDetails lds=new LoginDetails();
        lds.setUsername(rs.getString(1));
        lds.setPassword(rs.getString(2));
        lds.setUsertype(rs.getString(3));
        lds.setActive(rs.getString(4));
        details.add(lds);

    }
    return details.toArray(new LoginDetails[0]);

【讨论】:

  • 我进行了必要的更改并运行程序得到以下警告:服务类“com.tutorial.GetData”不符合 JAX-RPC 1.1 的一项或多项要求规范,并且可能无法正确部署或运行​​。服务类“com.tutorial.GetData”上的方法“getDetails”使用 JAX-RPC 规范不支持的数据类型“java.util.Collection”。该类型的实例可能无法正确序列化或反序列化。可能会导致数据丢失或 Web 服务完全失败。
  • 忽略警告并运行代码会给出以下输出:[[Ljava.lang.Object;@19214b1, [Ljava.lang.Object;@1afd9cc]跨度>
  • 我必须对 wsdl 文件进行任何更改吗??
  • @NeloAngelo:好的,不知道。我已经更改了上面的代码。
  • 感谢您的回复,所做的更改使警告消失了,但我仍然得到对象引用。这是我按照建议进行更改后得到的结果:[com.tutorial.LoginDetails@2507a053, com.tutorial.LoginDetails@349fbf38]
【解决方案2】:

建议返回一个集合类型 java.util.List ,最好从方法中返回 ArrayList。

【讨论】:

  • 最好使用最常用的类型。我会在这里使用CollectionList 已订购,Collection 未订购。如果您使用List,您应该能够描述它的订购方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
相关资源
最近更新 更多