我正在使用休眠和弹簧安全性来开发Spring Web应用程序。使用JUnit测试我的dao层:使用JavaConfig进行Spring和休眠
在实现了DAO(使用通用dao模式)并为CustomUserDetailService和CustomUserDetails进行spring安全性之后,似乎我无法登录(我在内存ID中使用并且它正在工作),所以我认为它必须在我的DAO中是个问题。
1)我使用JavaConfig我的配置,这初始化:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppConfig.class,SecurityConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
我以前从未使用过的JUnit测试,我发现使用XML配置的所有例子,所以我需要在其他一些帮助,一个例子会很棒。
2)由于我无法使用JUnit,我试图弄清楚问题是什么,所以我添加了一个控制器方法,在那里我得到一些用户并在页面中显示它们,但是我的GlobalException处理程序拦截并重定向了我此异常的错误页:
org.springframework.orm.hibernate4.HibernateSystemException: No Session found for current thread; nested exception is org.hibernate.HibernateException: No Session found for current thread
这里是我的GenericDaoImpl:
public class GenericDaoImpl<T,ID extends Serializable> implements GenericDao<T,ID> {
private Class<T> persistentClass;
@SuppressWarnings("unchecked")
public GenericDaoImpl(Class<T> persistentClass) {
this.persistentClass = persistentClass;
}
@Autowired
private SessionFactory sessionFactory;
public Session getSession()
{
return sessionFactory.getCurrentSession();
}
@Override
public boolean create(T t) {
if (t== null) return false;
getSession().saveOrUpdate(t);
return true;
}
@SuppressWarnings("unchecked")
@Override
public T getById(ID id) {
return (T) getSession().get(persistentClass,id);
}
@Override
public boolean update(T t) {
if (t==null) return false;
getSession().update(t);
return true;
}
@Override
public boolean delete(T t) {
if (t==null) return false;
getSession().delete(t);
return true;
}
@Override
public boolean deleteById(ID id) {
T t =getById(id);
if (t==null) return false;
getSession().delete(t);
return true;
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByOneCriteria(Criterion criterion) {
Criteria criteria = getSession().createCriteria(persistentClass);
criteria.add(criterion);
return (List<T>)criteria.list();
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByCriterias(ArrayList<Criterion> criterions) {
Criteria criteria = getSession().createCriteria(persistentClass);
for (Criterion c : criterions)
criteria.add(c);
return (List<T>)criteria.list();
}
}
而且我PersonnelDaoImpl:
@Repository
public class PersonnelDaoImpl extends GenericDaoImpl<Personnel,Integer> implements PersonnelDao {
public PersonnelDaoImpl(){
super(Personnel.class);
}
@Override
public Personnel findByUsername(String username) {
List<Personnel> result = findByOneCriteria(Restrictions.like("username",username));
return result.get(0);
}
@Override
public List<Personnel> findByRole(int role) {
return findByOneCriteria(Restrictions.eq("role",role));
}
}
我没有得到什么错。
值属性你得到一个异常,当你尝试登录? – 2014-09-03 08:14:07
我解决了问题的第二部分(我添加了一个答案),并回答你的问题:不,我得到的例外是当我测试我的服务时(我做了一个可以访问的页面,即使用户没有登录在,并使用该服务用于登录),我得到了上述异常 – Aissasa 2014-09-03 12:12:25