java.sql.SQLException: Cannot create com.yang.entity.SUser: com.yang.entity.SUser Query: select * from s_user where username=? and password=? Parameters: [yang, 123456]
报错内容:
java.sql.SQLException: Cannot create com.yang.entity.SUser: com.yang.entity.SUser Query: select * from s_user where username=? and password=? Parameters: [yang, 123456]
at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:351)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:289)
at com.yang.util.JdbcUtil.queryOne(JdbcUtil.java:48)
at com.yang.dao.impl.UserDaoImpl.checkAdmin(UserDaoImpl.java:17)
at com.yang.service.impl.UserServiceImpl.checkAdmin(UserServiceImpl.java:19)
at com.yang.controller.UserServlet.adminLogin(UserServlet.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.yang.controller.BaseServlet.service(BaseServlet.java:19)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.yang.filter.UserFilter.doFilter(UserFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1634)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
今天利用commons-dbUtils工具包连接数据库,在访问数据库获得数据的时候出现了报错。
解决:实体类中创建无参构造
思考和解决的过程:
我自己通过common-dbutil工具包再次封装的方法:
/*查询多条数据*/
public static <T> List<T> queryList(Class clazz, String sql, Object... args){
try {
BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
return runner.query(sql,new BeanListHandler<T>(clazz,brp),args);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
实体类:
public class SUser implements Serializable {
private String id;
private String username;
private String password;
private Integer type;
public SUser(String id, String username, String password, Integer type) {
this.id = id;
this.username = username;
this.password = password;
this.type = type;
}
@Override
public String toString() {
return "SUser{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", type=" + type +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
}
dao层的方法:
@Override
public SUser checkAdmin(String username, String password) {
return JdbcUtil.queryOne(SUser.class, "select * from s_user where username=? and password=?", username, password);
}
思考:报错信息是没有不能创建SUser这个类。但是我又SUser实体类呀,而且dao层方法的参数也没有问题。那为什么不能创建SUser类呢?
后来突然想到封装jdbc工具类的时候方法里面用到的反射Class,如果是反射的那问题应该是出现在反射的时候没有成功创建SUser对象。后来想利用反射创建来的时候会用到无参构造。终于找到原因了
总结:所以在创建实体类的时候,防止后面出现错误。我们在创建的时候就将无参,全参构造器都创建好。