我关注this tutorial但我需要在没有hbm.xml文件的情况下进行查询,而是使用dao和服务层 . 我已经使用hibernate为users和user_roles表生成了模型 . 我还创建了dao和服务层 .
问题是我得到一个错误,说明没有定义名为'myUserDetailsService'的bean . 我知道我必须创建一个bean,但我无法弄清楚如何做到这一点 .
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myUserDetailsService' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1159)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:282)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
... 93 more
我已将完整项目上传到github . 任何帮助/建议都是相关的 .
https://github.com/kunal7L/Spring-MVC-Security-Hibernate
我的 beans 子:
<bean id="userDao" class="com.mkyong.users.dao.UserDaoImpl">
<property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</bean>
<bean id="userService" class="com.mkyong.users.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- <bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService"> -->
<!-- <property name="userDao" ref="userDao" /> -->
<!-- </bean> -->
完整的MyUserDetailsService类:
公共类MyUserDetailsService实现UserDetailsService {
private UserService userservice;
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
// Programmatic transaction management
/*
return transactionTemplate.execute(new TransactionCallback<UserDetails>() {
public UserDetails doInTransaction(TransactionStatus status) {
com.mkyong.users.model.User user = userDao.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
return buildUserForAuthentication(user, authorities);
}
});*/
Users user = userservice.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRoleses());
return buildUserForAuthentication(user, authorities);
}
// Converts com.mkyong.users.model.User user to
// org.springframework.security.core.userdetails.User
private User buildUserForAuthentication(Users user, List<GrantedAuthority> authorities) {
return new User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities);
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRoles> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRoles userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
}
3 回答
错误很明显:
在spring-security.xml文件中,您引用了一个名为myUserDetailsService的bean:
但是,您已在spring-database.xml中注释掉了定义该服务的部分
这就是错误发生的原因
我通过理解HoàngLong的逻辑来解决它 . 我知道我错过了一个 beans 子,但我只是不知道在里面引用了什么 . 所以我用Google搜索并发现MyUserDetailsService在UserDetailsService上实现,这是Spring Security的一部分 . 所以唯一要做的就是添加没有属性的bean .
很可能你有Dao对象的问题,我不知道你是如何设置的,但是如果你使用注释,那么你必须配置persistance.xml并将它放在META-INF文件夹中,你需要知道应用程序上下文关于它这个链接将帮助你更好地理解你的问题http://www.journaldev.com/3531/spring-mvc-hibernate-mysql-integration-crud-example-tutorial只是寻找Hibernate数据源配置以及如何在你的Dao层使用它 .