问题是这样的 我用的是hibernate 框架做数据访问
因为用到spring security,我的用户实体类SysUser 实现了spring security的接口UserDetails
SysUser.java代码如下
[code="java"]
@Entity
@Table(name="sys_user")
@org.hibernate.annotations.Proxy(lazy = false)
public class SysUser implements java.io.Serializable ,UserDetails{
private Integer userId;
private String uloginName;
private String upassword;
//其他property及相关setter getter略
//实现UserDetails接口方法
@Override
@Transient
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}
@Override
@Transient
public String getPassword() {
// TODO Auto-generated method stub
return this.upassword;
}
@Override
@Transient
public String getUsername() {
// TODO Auto-generated method stub
return this.uloginName;
}
@Override
@Transient
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
@Transient
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
@Override
@Transient
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
@Transient
public boolean isEnabled() {
// TODO Auto-generated method stub
return this.ustatus==0?true:false;
}
[/code]
我的dao类 数据访问方法如下
SysUserDaoHbnImpl.java
[code="java"]
@Repository("sysUserDao")
public class SysUserDaoHbnImpl implements SysUserDao{
private static final Log log = LogFactory.getLog(SysUserDao.class);
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@SuppressWarnings("unchecked")
@Cacheable(cacheName = "baseCache")
public List selectRecordForPage(QueryPara qp) {
// TODO Auto-generated method stub
//处理分页开始
List result=null;
try
{
Criteria criteria = this.sessionFactory.getCurrentSession().createCriteria(qp.getClazz());
List list=qp.getCriterions();
if (list != null)
{
if(list.size()>0)
{
//Set keys = map.keySet();
for (Criterion cri : list)
{
criteria.add(cri);
}
}
}
// 获取根据条件分页查询的总行数
//System.out.println("获取根据条件分页查询的总行数");
int rowCount = ((Number) criteria.setProjection(
Projections.rowCount()).uniqueResult()).intValue();
criteria.setProjection(null);
qp.setRecordcount(rowCount);
qp.setPagecount((qp.getRecordcount()+qp.getPagesize() - 1)/qp.getPagesize());
if(qp.getPageNo()>qp.getPagecount())
{
qp.setPageNo(qp.getPagecount());
}
if(qp.getPageNo()<1)
{
qp.setPageNo(1);
}
List<Order> list2=qp.getOrders();
if (list2 != null)
{
if(list2.size()>0)
{
//Set<String> keys = map2.keySet();
for (Order ord : list2)
{
criteria.addOrder(ord);//(Restrictions.like(key, map2.get(key)));
}
}
}
criteria.setFirstResult((qp.getPageNo() - 1) * qp.getPagesize());
criteria.setMaxResults(qp.getPagesize());
result = (List<SysUser>)criteria.list();
}
catch (RuntimeException re)
{
log.error(re.getMessage());
}
return result;
//处理分页结束
}
}
[/code]
服务层代码略,负责调用SysUserDaoHbnImpl.java的selectRecordForPage方法
我的控制器 负责调用服务层用户数据分页方法,然后服务层继续调用数据访问层SysUserDaoHbnImpl.java的selectRecordForPage方法
我的控制器UserController.java调用方法如下
[code="java"]
@RequestMapping(value={"/List"},method=RequestMethod.GET)
public String list(
@RequestParam(value="page", defaultValue="1") int page,
@RequestParam(value="perPage", defaultValue="30") int perPage,
ModelMap modelMap)
{
QueryPara<SysUser> qp=new QueryPara<SysUser>();
qp.setClazz(SysUser.class);
qp.setPagesize(perPage);
qp.setPageNo(page);
modelMap.put("userlist", this.sysUserService.selectRecordForPage(qp));
modelMap.put("QueryPara", qp);
return "UserManager/List";
}
[/code]
我的视图userlist.jsp里面的java代码如下
[code="java"]
List list=(List)request.getAttribute("userlist");
if(list.size()>0)
{
Iterator it=list.iterator();
SysUser sysUser=null;
while(it.hasNext())
{
sysUser=(SysUser)it.next(); //此处抛出异常:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [SysUser]
}
[/code]
我运行系统,打开显示用户数据页面,SysUserDaoHbnImpl.java数据分页方法selectRecordForPage我设置断点都没有抛出异常,就在视图页面sysUser=(SysUser)it.next(); 这个地方抛出异常java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [SysUser]
请问高手 这是什么原因,应该如何修改呢,不胜感谢
附上我的测试情况:
(一)第一种情况,在原来系统里面SysUser.java没有实现UserDetails(spring security里面的一个接口)接口时,
用户数据显示视图userlist.jsp是显示正常的,可以看到用户数据
(问题是 现在SysUser.java实现接口UserDetails,怎么在视图层sysUser=(SysUser)it.next()就出问题? )
(二) 第二种情况,当我把SysUserDaoHbnImpl.java数据分页方法selectRecordForPage里面的下面代码部分做如下修改的时候 运行正常
[code="java"]
//注释下面代码
//int rowCount = ((Number) criteria.setProjection(
//Projections.rowCount()).uniqueResult()).intValue();
// criteria.setProjection(null);
//手动设置int rowCount值
int rowCount=1;//我用户表目前实际只有一个用户
[/code]
注释掉上面的Projections相关代码后,userlist.jsp页面也是运行正常的