【问题标题】:I'm getting error in particular line....what should I change?我在特定行出现错误....我应该改变什么?
【发布时间】:2021-07-11 16:53:50
【问题描述】:

这是我得到错误的那一行

List<Map<String, Object>> users = jdbcTemplate.queryForList("select * from user where email=? and pass=?",new Object[] { email, pass }, new MyRowMapper());

这是整个代码:

package com.example.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.example.model.User;

@Repository
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public int insert(User user) {
        return jdbcTemplate.update("insert into user values(?,?,?,?,?)",
                new Object[] { user.getName(), user.getEmail(), user.getPass(),user.getProfileimage(),user.getExpensetable() });
    }

    public int updateProfile(User user) {
        return jdbcTemplate.update("update user set name=?,pass=?,profile=?,expensetable=? where email=?",
                new Object[] { user.getName(), user.getPass(), user.getProfileimage(),user.getExpensetable(), user.getEmail() });
    }

    public User login(String email, String pass) {
        User user = null;
        List<Map<String, Object>> users = jdbcTemplate.queryForList("select * from user where email=? and pass=?",new Object[] { email, pass }, new MyRowMapper());
        if (users.size() > 0) {
            user = (User) users.get(0);
        }
        return user;
    }

    private class MyRowMapper implements RowMapper<User> {

        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setName(rs.getString(1));
            user.setEmail(rs.getString(2));
            user.setPass(rs.getString(3));
            user.setProfileimage(rs.getString(4));
            user.setExpensetable(rs.getString(5));
            return user;
        }

    }
}

这是错误:

严重:servlet [dispatcher] 在路径 [/ExpenseSpringProject] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [select * from user where email=?并通过=?];无效的参数值:java.io.NotSerializableException;嵌套异常是 java.sql.SQLException: Invalid argument value: java.io.NotSerializableException] 的根本原因

java.io.NotSerializableException: com.example.dao.UserDao$MyRowMapper

【问题讨论】:

  • 你遇到了什么错误? (总是,总是,总是告诉我们错误是什么。)
  • 我在第 31 行遇到错误,我应该改变什么 你应该改变你的问题并添加你得到的错误信息。回答者手动解析您的代码以查找错误的原因是什么?
  • 已经更新
  • 这个签名的方法在当前版本的Spring中是deprecated

标签: java sql eclipse


【解决方案1】:

您调用了错误的 JdbcTemplate 方法。

method you are calling 接受查询和绑定参数值的可变参数数组。您调用它的方式是将以下内容作为绑定参数值传递:

  • 包含您的电子邮件和密码的数组。
  • 一个行映射器。

行映射器没有用于映射行,而是您尝试将其传递给数据库,就好像它本身就是一个值一样。

我想你想使用the overload of JdbcTemplate.query that takes a query, a row-mapper and the bind parameter values in that order

换行试试

    List<Map<String, Object>> users = jdbcTemplate.queryForList("select * from user where email=? and pass=?",new Object[] { email, pass }, new MyRowMapper());

    List<User> users = jdbcTemplate.query("select * from user where email=? and pass=?", new MyRowMapper(), email, pass);

完成此操作后,user = (User) users.get(0); 行中对User 的强制转换应该变得不必要了,您可以将其删除。

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多