prb与我的json回应

时间:2014-08-18 14:01:33

标签: java json web-services http get

我正在开发一个Web服务,它从数据库中提取所有消息,作为json响应 这是我的用户密码&登录,搜索他们的ID并从数据库中提取用户的消息:

@GET
@Path("/historiquemethod")
@Produces("application/json")
public msgTabl historique(
        @QueryParam("pseudo") String pseudo,
        @QueryParam("motDePasse") String motDePasse
) {

    msgTabl tab = new msgTabl();
    MsgBean ms = new MsgBean();

    int i = 0;
    int id = 0;

    // extraire l'id de la personne selon le pseudo & le mot de passe
    try {
        ResultSet rs1 = conn.createStatement().executeQuery("select id_u from utilisateur where pseudo='" + pseudo + "'and motdepasse='" + motDePasse + "' ");
        if (rs1.next()) {
            id = rs1.getInt(1);
        }
    } catch (SQLException ex) {

    }

    // extraire les messages et les mettre dans le tableau
    try {
        ResultSet rs2 = conn.createStatement().executeQuery("select * from message where idUser='" +id+ "'");
        while (rs2.next()) {
            tab.setTest("ok");

            String  from2 = rs2.getString("fromm");
            String  contenu2 = rs2.getString("contenu");
            String  dateenvoi2 = rs2.getString("DateEnvoi");
            String numexp2 = rs2.getString("NumExp");

            ms.setFrommm(from2);
            ms.setContenu(contenu2);
            ms.setDateEnvoi(dateenvoi2);
            ms.setNumExp(numexp2);

            tab.m[i] = ms;
            i = i + 1;
        }
    } catch (SQLException ex) {

        tab.setTest("Catch error");
    }


    return tab;
} 

每条消息都是" msgbean"其中包含一些信息(from,to,content,id,idUser,Date ...)

并且WS的响应是" msgTabl"这是一个包含在msgbean和字符串表中的对象,

问题是我的ws总是只返回最后一条消息!! 这意味着如果用户有3条消息,只有最后一条消息返回3次!!

{
  "msgTabl": {
    "m": [
      {
        "contenu": 3333333333,
        "dateEnvoi": 3333333333,
        "frommm": 333333333,
        "id": 3,
        "idu": 1,
        "numExp": 33333333333
      },
      {
        "contenu": 3333333333,
        "dateEnvoi": 3333333333,
        "frommm": 333333333,
        "id": 3,
        "idu": 1,
        "numExp": 33333333333
      },
      {
        "contenu": 3333333333,
        "dateEnvoi": 3333333333,
        "frommm": 333333333,
        "id": 3,
        "idu": 1,
        "numExp": 33333333333
      }
    ],
    "test": "ok"
  }
}
你可以告诉我,请问错误在哪里?是他们的任何prb与我的代码? 另外,我想知道为什么msgTabl存在于json响应中? 我的意思是为什么我没有得到

{
  "m": [
    {
      "contenu": 3333333333,
      "dateEnvoi": 3333333333,
      "frommm": 333333333,
      "id": 3,
      "idu": 1,
      "numExp": 33333333333
    },
    {
      "contenu": 3333333333,
      "dateEnvoi": 3333333333,
      "frommm": 333333333,
      "id": 3,
      "idu": 1,
      "numExp": 33333333333
    },
    {
      "contenu": 3333333333,
      "dateEnvoi": 3333333333,
      "frommm": 333333333,
      "id": 3,
      "idu": 1,
      "numExp": 33333333333
    }
  ],
  "test": "ok"
}

直接?

1 个答案:

答案 0 :(得分:0)

问题是您的代码只创建一个MsgBean ms对象,并将相同的内容一遍又一遍地插入到数组中。这就是为什么你得到相同数据的三倍,实际上你实际上三次显示同一个对象。您需要将该对象的实例化移动到循环内部,如下所示:

while (rs2.next()) {
    tab.setTest("ok");

    String  from2 = rs2.getString("fromm");
    String  contenu2 = rs2.getString("contenu");
    String  dateenvoi2 = rs2.getString("DateEnvoi");
    String numexp2 = rs2.getString("NumExp");
    // a fresh ms per iteration
    MsgBean ms = new MsgBean();
    ms.setFrommm(from2);
    ms.setContenu(contenu2);
    ms.setDateEnvoi(dateenvoi2);
    ms.setNumExp(numexp2);

    tab.m[i] = ms;
    i = i + 1;
}

接下来,看起来你的类msgTabl(类名应该以大写字母开头,最好将其重命名为MsgTabl)包含一个数组,可能更喜欢用ArrayList替换该数组,特别是当列表的长度可变时。


关于John Gardner关于SQL注入的声明 - 将查询字符串串在一起确实非常危险 - 请参阅http://bobby-tables.com/,了解为什么有一天会< / strong>如果您没有解决此问题,请进行黑客攻击或破坏。使用PreparedStatement来解决这个问题非常简单:

PreparedStatement statement = conn.prepareStatement("select id_u from utilisateur where pseudo= ? and motdepasse= ?");
statement.setString(1,pseudo);
statement.setString(2,motDePasse);
ResultSet rs1 = statement.executeQuery();