【问题标题】:prb with my json responseprb 与我的 json 响应
【发布时间】:2014-08-18 14:01:33
【问题描述】:

我正在开发一个从数据库中提取所有消息的 Web 服务,作为 json 响应 这是我的 ws,它获取用户的密码并登录,搜索他们的 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"
}

直接?

【问题讨论】:

  • 请将该代码放入问题中,并正确格式化为代码。
  • 完成!你现在可以阅读了
  • sql 注入,它们烧毁了!请请请修复sql注入! stackoverflow.com/questions/332365/…
  • @JohnGardner 我不明白这是什么意思??
  • 您正在使用字符串连接直接构建查询,这使得恶意的人可以做非常糟糕的事情。例如,如果我将“' or 1=1”作为密码传递,你的代码会发生什么?你真的应该使用参数标记来构建查询,并且从不通过字符串连接。见en.wikipedia.org/wiki/Sql_injection

标签: java json web-services http get


【解决方案1】:

问题在于您的代码只创建了一个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/ 以获得关于为什么有一天你被黑客入侵或如果你不解决这个问题,就会遭到破坏。用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();

【讨论】:

  • 谢谢,现在它返回正确的消息!关于我的 json 响应,我以大写字母开头重命名了 msgTabl 类。并用一个列表进行了更改,现在我有了我的类“MsgTabl”,其中包含 {String test; AND List list = new ArrayList();但是我仍然得到了相同的 json 格式(在下一条评论中提到),你知道我该如何解决这个问题吗?我如何更改我的 json,以便我在开始时获得一个没有那个 msgtabl 的简单 json,或者我如何从客户端部分的这个 json 响应中提取数据??
  • { "msgTabl": {"list": [ {"contenu":"aid mabroukk","dateEnvoi":"2014-07-30","frommm":"voeuxmsg","id":0,"idu":0,"numExp":50840749}, {"contenu": 222222222222,"dateEnvoi": 222222,"frommm":222222222222,"id":0,"idu":0,"numExp":2222222}, {"contenu":3333333333,"dateEnvoi":3333333333, "frommm":333333333,"id":0,"idu":0,"numExp":33333333333} ], "test":"ok" } }
  • 只是猜测,但您是否将@XmlRootElement 注释添加到您的msgTabl 类中?查看the Jersey tutrial 以获得更详细的示例。
  • 我真的不知道放置该注释的重要性,但我只是喜欢我正在遵循的教程,如果我删除它,Web 服务无法访问该类来获取和设置信息!
  • 正如您在我链接到您的教程中看到的那样,应该已经获得了您想要的结果。我不知道那里发生了什么。您能否将代码添加到 msgTabl 类中,并告诉我们您使用的是什么堆栈?
猜你喜欢
  • 2015-03-03
  • 1970-01-01
  • 2013-01-02
  • 2016-12-29
  • 2014-02-28
  • 2014-04-05
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多