我正在使用hibernate和spring安全性的spring web应用程序。
在实现DAO(使用通用dao模式)并为SpringUserDetails创建CustomUserDetailService以实现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 Handler拦截了它并将我重定向到带有此例外的错误页面:
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));
}
}
我没有弄到什么问题。
答案 0 :(得分:1)
使用Java创建测试用例的配置,
在测试类上使用这些注释。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Config.class})
public class ServiceTest{
}
和Config.class看起来像,
@Configuration
public class Config {
}
在Config类中定义bean并执行测试用例。
2)
很清楚,No session
表示在调用您的DAL的图层中没有定义TransactionManager
。
尝试使用@Transactional
为您做到这一点。
注意:请确保@Transactional
允许默认为transactionManager
的值属性
答案 1 :(得分:0)
关于第二部分2),我找到了解决方案,我必须将@Transactional
添加到我的服务中,this帖子帮助了我