当我保存时,我在 Java Spring 中得到这个异常
When I save I get this exception in Java Spring
我的代码中有这个异常。我是 Java 的新手。下面我提到我的代码。
我需要知道为什么即使我给名称参数赋值也会发生这种情况。
我多次更改我的参数,但它给了我同样的异常。
我用Springframework 4.3.7
spring-context
,spring-webmvc
,spring-jdbc
.
这是我的 UserDaoImpl 代码
package com.ezeon.capp.dao;
import com.ezeon.capp.domain.User;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl extends BaseDao implements IUserDao {
@Override
public void save(User u) {
String sql =" INSERT INTO user(name, phone, email, address, loginName,
password, role, loginStatus)"
+" VALUES ( :name, :phone, :email, :address, :loginName, :password,
:role, :logingStatus)";
Map m = new HashMap();
m.put("name", u.getName());
m.put("phone", u.getPhone());
m.put("email", u.getEmail());
m.put("address", u.getAddress());
m.put("loginName", u.getLoginName());
m.put("password", u.getPassword());
m.put("role", u.getRole());
m.put("loginStatus", u.getLoginStatus());
KeyHolder kh = new GeneratedKeyHolder();
SqlParameterSource ps = new MapSqlParameterSource();
super.getNamedParameterJdbcTemplate().update(sql, ps, kh);
Integer userId = kh.getKey().intValue();
u.setUserId(userId);
}
}
这是我的测试class
package com.ezeon.capp.test;
import com.ezeon.capp.config.SpringRootConfig;
import com.ezeon.capp.dao.IUserDao;
import com.ezeon.capp.domain.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestUserDaoSave {
public static void main(String[] args){
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringRootConfig.class);
IUserDao userdao = ctx.getBean(IUserDao.class);
User u = new User();
u.setName("Tharinda");
u.setPhone("0714536598");
u.setEmail("tharind@gmail.com");
u.setAddress("Kurunegala");
u.setLoginName("amit");
u.setPassword("123");
u.setRole(1);
u.setLoginStatus(1);
userdao.save(u);
System.out.println("-------------Saved-----------");
}
}
异常
Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'name': No value registered for key 'name'
at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:342)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:309)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:299)
at com.ezeon.capp.dao.UserDaoImpl.save(UserDaoImpl.java:42)
at com.ezeon.capp.test.TestUserDaoSave.main(TestUserDaoSave.java:35)
您的代码看起来不错,您已经为命名参数创建了一个映射。但是你并没有真正使用过它。
替换:
SqlParameterSource ps = new MapSqlParameterSource();
和
SqlParameterSource ps = new MapSqlParameterSource(m);
参考这个doc
我的代码中有这个异常。我是 Java 的新手。下面我提到我的代码。
我需要知道为什么即使我给名称参数赋值也会发生这种情况。
我多次更改我的参数,但它给了我同样的异常。
我用Springframework 4.3.7
spring-context
,spring-webmvc
,spring-jdbc
.
这是我的 UserDaoImpl 代码
package com.ezeon.capp.dao;
import com.ezeon.capp.domain.User;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl extends BaseDao implements IUserDao {
@Override
public void save(User u) {
String sql =" INSERT INTO user(name, phone, email, address, loginName,
password, role, loginStatus)"
+" VALUES ( :name, :phone, :email, :address, :loginName, :password,
:role, :logingStatus)";
Map m = new HashMap();
m.put("name", u.getName());
m.put("phone", u.getPhone());
m.put("email", u.getEmail());
m.put("address", u.getAddress());
m.put("loginName", u.getLoginName());
m.put("password", u.getPassword());
m.put("role", u.getRole());
m.put("loginStatus", u.getLoginStatus());
KeyHolder kh = new GeneratedKeyHolder();
SqlParameterSource ps = new MapSqlParameterSource();
super.getNamedParameterJdbcTemplate().update(sql, ps, kh);
Integer userId = kh.getKey().intValue();
u.setUserId(userId);
}
}
这是我的测试class
package com.ezeon.capp.test;
import com.ezeon.capp.config.SpringRootConfig;
import com.ezeon.capp.dao.IUserDao;
import com.ezeon.capp.domain.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestUserDaoSave {
public static void main(String[] args){
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringRootConfig.class);
IUserDao userdao = ctx.getBean(IUserDao.class);
User u = new User();
u.setName("Tharinda");
u.setPhone("0714536598");
u.setEmail("tharind@gmail.com");
u.setAddress("Kurunegala");
u.setLoginName("amit");
u.setPassword("123");
u.setRole(1);
u.setLoginStatus(1);
userdao.save(u);
System.out.println("-------------Saved-----------");
}
}
异常
Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'name': No value registered for key 'name'
at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:342)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:309)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:299)
at com.ezeon.capp.dao.UserDaoImpl.save(UserDaoImpl.java:42)
at com.ezeon.capp.test.TestUserDaoSave.main(TestUserDaoSave.java:35)
您的代码看起来不错,您已经为命名参数创建了一个映射。但是你并没有真正使用过它。
替换:
SqlParameterSource ps = new MapSqlParameterSource();
和
SqlParameterSource ps = new MapSqlParameterSource(m);
参考这个doc