【问题标题】:(Using Spring)How to stop DTO from repeating when the map appears to be fine?(使用 Spring)当地图看起来很好时如何阻止 DTO 重复?
【发布时间】:2015-06-15 20:13:33
【问题描述】:

在这个程序中,我有用户输入的三个数字,我试图通过从 DTO 中拉出要显示的集合中的第二个数字,以便我可以确认一切正常。但是从输出中您会看到出现了问题...

用户输入:858508321,858509491,858510385

//This code is what is being executed. (Think of it as main)
 private void handleSubmit(final AjaxRequestTarget target) {


        List<Long> msgNums = new ArrayList<Long>();

        msg_Num = Ta.getInput();

        String[] Numbers = msg_Num.split(",");

        for(String Number:Numbers){
             msgNums.add(Long.valueOf(Number));
        }

        System.out.println(msgNums.get(1));

        List<BulkReplayMessageDTO> brm = messageReplayDao.getMessageResults(msgNums);

        System.out.println(brm.get(1).getMsgNum());
 }

//This is the DAO
public class MessageReplayDao extends SimpleJdbcDaoSupport {


     private final static String sql = "SELECT MSG_NBR, MSG_CPSD_DATA"
                + " FROM nti_raw_msg"
                + " WHERE THRD_NAME IS NOT null AND THRD_NAME NOT LIKE"
                + " 'out%' AND MSG_NBR IN (:messageNumbers)";


    public List<BulkReplayMessageDTO> getMessageResults(final List<Long> msgNumList){
        SqlParameterSource parameters = new MapSqlParameterSource()
            .addValue("messageNumbers", msgNumList);
        List<BulkReplayMessageDTO> result = getSimpleJdbcTemplate().query(sql, new MessageReplayMap(), parameters);
        return result;
    }
}

//The Map
public class MessageReplayMap implements ParameterizedRowMapper<BulkReplayMessageDTO> {

    public MessageReplayMap(){
    }

    LobHandler lobHandler = new DefaultLobHandler();
    @Override
    public final BulkReplayMessageDTO mapRow(ResultSet rs, int rowNum)
            throws SQLException {
        final BulkReplayMessageDTO brm = new BulkReplayMessageDTO();
        System.out.println(rowNum);
        brm.setMsgNum(rs.getLong("MSG_NBR"));
        brm.setMSG(CompressionUtils.uncompress(lobHandler.getBlobAsBytes(rs, "MSG_CPSD_DATA")));

        return brm;
    }
}

//And finally the DTO
 public class BulkReplayMessageDTO{
      private static Long msgNum;
      private static String MSG;

      public  final Long getMsgNum() {
        return msgNum;
      }
      public final void setMsgNum(final Long msgNumTemp) {
        msgNum = msgNumTemp;
      }

      public  final String getMSG(){
          return MSG;
      }
      public final void setMSG(final String MSGTemp){
          MSG = MSGTemp;
      }
}

请注意,我已在 handleSubmit 方法中打印到控制台,并在我的地图中。我得到的输出是

858509491
0
1
2
858510385 

应该是什么时候

858509491
0
1
2
858509491

我不知道问题可能是什么,因为我发现了其他几乎相同的代码示例,而我的似乎非常相似。我对使用 Spring 很陌生,如果答案真的很明显,我很抱歉。

【问题讨论】:

  • 啊,我应该补充一点,即使我尝试从 DTO 中的不同行打印,我仍然会得到 858510385。
  • 我想这仅仅是因为您使用的 ArrayList 不能保持顺序。我无法帮助您,因为我真的不知道数据库中有什么,如果您需要进一步的帮助,请在您的映射器rs.getLong("MSG_NBR") 中进行系统处理。可能会给出一个想法。
  • 感谢 Minion 的建议。我按照你的建议做了,我看到一切都以正确的顺序打印出来。所以我可以将问题缩小到 DTO 或我的 DAO。映射器似乎很好。

标签: java spring jdbc mapping


【解决方案1】:

我发现了问题,而且问题非常简单。在 DTO 中,变量从我之前正在处理的问题中变成静态的。解决问题后,我忘记了摆脱它。如果我理解静态的含义,那么我已经使这些变量的所有实例都相同。所以这就是为什么我只能打印出用户输入的最后一个数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2014-12-17
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2014-08-23
    相关资源
    最近更新 更多