没有使用休眠和 Spring MVC 定义名为“myUserDetailsS​​ervice”的 bean

Posted

技术标签:

【中文标题】没有使用休眠和 Spring MVC 定义名为“myUserDetailsS​​ervice”的 bean【英文标题】:No bean named 'myUserDetailsService' is defined Spring Security with hibernate and Spring MVC 【发布时间】:2015-07-16 22:17:46 【问题描述】:

我正在关注this tutorial,但我需要在没有 hbm.xml 文件的情况下进行查询,而是使用 dao 和服务层。我已经使用 hibernate 为用户和 user_roles 表生成了模型。我还创建了 dao 层和服务层。

问题是我得到一个错误,说没有定义名为“myUserDetailsS​​ervice”的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

我的豆子:

 <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> -->

完整的 MyUserDetailsS​​ervice 类:

公共类 MyUserDetailsS​​ervice 实现 UserDetailsS​​ervice

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;

【问题讨论】:

不要链接到第三方网站。编辑您的帖子以包含相关代码。 【参考方案1】:

错误很明显:

没有定义名为“myUserDetailsS​​ervice”的bean

在您的文件 spring-security.xml 中,您引用了一个名为 myUserDetailsS​​ervice 的 bean:

<authentication-manager>
    <authentication-provider user-service-ref="myUserDetailsService" >
        <password-encoder hash="bcrypt" />    
    </authentication-provider>
</authentication-manager>

但是,您已经注释掉了 spring-database.xml 中定义该服务的部分

<!--    <bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService"> -->
<!--        <property name="userDao" ref="userDao" /> -->
<!--    </bean> -->

这就是错误发生的原因

【讨论】:

我留下了评论,因为我不知道我应该在属性名称或引用中输入什么。我将使用完整的课程代码编辑问题。 @Kunal:我不太明白你的问题。我会尝试猜测。 ref = "userDao",这意味着你也必须在某个地方定义一个名为 "userDao" 的 bean。这里的某处意味着同一文件中上面的几行:您还注释掉定义它的代码 ( ). 简而言之,配置想说:authentication-manager use myUserDetailsS​​ervice (com.mkyong.users.service.MyUserDetailsS​​ervice 实现),而后者又使用 userDao (com.mkyong.users.dao. UserDaoImpl),而后者又使用 sessionFactory = hibernate4AnnotatedSessionFactory)。将它们视为一棵树,其中每个节点都依赖于其他节点。您需要全部定义它们才能使应用程序正常工作 感谢您的所有帮助。通过理解你的逻辑,我得到了答案。我将发布非常简单的答案。【参考方案2】:

您的 Dao 对象很可能有问题,我不确定您是如何设置的,但如果您使用注释,那么您必须配置您的 persistance.xml 并将其放在 META-INF 文件夹中,并且您需要将应用程序上下文了解它此链接将帮助您更好地了解您的问题 http://www.journaldev.com/3531/spring-mvc-hibernate-mysql-integration-crud-example-tutorial 只需查找 Hibernate 数据源配置以及如何在您的 Dao 层中使用它。

<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url"
            value="jdbc:mysql://localhost:3306/TestDB" />
        <beans:property name="username" value="pankaj" />
        <beans:property name="password" value="pankaj123" />
    </beans:bean>

【讨论】:

我遵循了该教程并成功使用它,但我需要实现一个用户登录组件,这就是我必须使用 Spring Security 的原因。但我需要使用服务层而不是使用 .hbm.xml 文件,就像在您发送的链接中一样。【参考方案3】:

我通过理解 Hoàng Long 的逻辑解决了这个问题。我知道我错过了一个 bean,但我只是不知道在其中引用什么。所以我搜索了一下,发现 MyUserDetailsS​​ervice 在 UserDetailsS​​ervice 上实现,这是 Spring Security 的一部分。所以剩下要做的就是添加完全没有属性的bean。

<bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService" >

    </bean>

【讨论】:

以上是关于没有使用休眠和 Spring MVC 定义名为“myUserDetailsS​​ervice”的 bean的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 和 JSR-303 休眠条件验证

Spring MVC“org.hibernate.PropertyAccessException”中的休眠注释映射异常

请解释spring MVC,hibernate和Spring security

“找不到名为'product'的持久性单元”

休眠 | Spring Data JPA | @OneToOne

Spring Boot Data JPA:休眠会话问题