【问题标题】:Error creating Bean with name EntityManagerFactory创建名为 EntityManagerFactory 的 Bean 时出错
【发布时间】:2020-07-12 07:47:29
【问题描述】:

大家好,我正在使用 spring security 和 mysql 数据库开发身份验证服务,并且在运行我的 springboot 应用程序时出现此错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]

这是我的pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.7.Final</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

这是我的SecurityConfig.java

    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @EnableWebSecurity
    @EnableJpaRepositories(basePackageClasses = UsersRepository.class)
    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    private MyUserDetailsService myUserDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(myUserDetailsService)
                    .passwordEncoder(getPasswordEncoder());

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("**/admin/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .formLogin().permitAll();
    }

    private PasswordEncoder getPasswordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }

            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return true;
            }
        };
    }
}

这是我的Users.java

@Entity
@Table(name = "user")
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;

    @Column(name = "login")
    private String login;

    @Column(name = "password")
    private String password;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    public Users() {
    }

    public Users(Users users){

        this.id=users.getId();
        this.login=users.getLogin();
        this.password=users.getPassword();
        this.roles=users.getRoles();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

这是roles.java

@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")
    private int roleId;

    @Column(name = "role")
    private String role;

    public Role() {
    }

    public int getRoleId() {
        return roleId;
    }

    public void setRoleId(int roleId) {
        this.roleId = roleId;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

这是我的UsersRepository.java

@Repository
public interface UsersRepository extends JpaRepository<Users, Integer> {
    Optional<Users> findByName(String username);
}

这是MyUserDetailsService.java

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UsersRepository usersRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Users> optionalUsers = usersRepository.findByName(username);

        optionalUsers
                .orElseThrow(() -> new UsernameNotFoundException("Utilisateur Introuvable!"));
        return optionalUsers
                .map(MyUserDetails::new).get();
    }
}

这是MyUserDetails.java

public class MyUserDetails extends Users implements UserDetails {


    public MyUserDetails(final Users users) {
        super(users);
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        return getRoles()
                .stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRole()))
                .collect(Collectors.toList());
    }

    @Override
    public String getPassword() {
        return super.getPassword();
    }

    @Override
    public String getUsername() {
        return super.getLogin();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

最后是我的资源控制器AuthenticationCOntroller.java

@RequestMapping("/api")
@RestController
public class AuthentificationController {


    @GetMapping(value = "/login")
    public String hello() {

        return "Hello World";
    }

    @PreAuthorize("hasAnyRole('ADMIN')")
    @GetMapping("/admin/login")
    public String helloAdmin() {
        return "Hello ADMIN";
    }

    @GetMapping("/login/alternate")
    public String alternate() {
        return "alternate";
    }

}

这是application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password =
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT 1
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

我正在使用 MYSQL 数据库,它连接良好,并且表是使用一些值创建的。

谢谢您,等待您的答复。

【问题讨论】:

  • spring-boot-starter-data-jpa 依赖已经包含了hibernate-core。尝试先删除hibernate-core 依赖?

标签: spring hibernate spring-boot spring-security entitymanager


【解决方案1】:

pom.xml依赖有冲突:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

spring-boot-starter-jpa 具有 hibernate-core 依赖关系 included

可以像这样查看项目的依赖图:

mvn dependency:tree
mvn dependency:list

这些命令将显示编译中包含的 Hibernate 版本。

要修复 entityManagerFactory bean 的 UnsatisfiedDependencyException,只需从 pom.xml 中删除 hibernate-core 依赖项

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.0.7.Final</version>
</dependency>

【讨论】:

  • 不幸的是,我这样做了但没有用,现在我有第二个错误,它说 jdbc 时区不正确:/
  • 我不完全确定您面临的新问题是什么,但是,看起来移除 Hibernate 的依赖项实际上适用于上述场景。至于 JDBC 时区,也许这个答案对您有用? MySQL JDBC Time Zone Unrecognized
  • 我已经删除了休眠依赖,我现在遇到了这个问题:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“securityConfig”的bean时出错:通过字段“myUserDetailsS​​ervice”表示的依赖不满足;
  • 现在您面临一个由于项目内部逻辑而发生的异常。您应该按照您提到的错误中的说明检查securityConfig bean。
  • 告诉我这里UsersRepository.findByName(java.lang.String)有问题!找不到类型用户的属性名称!
【解决方案2】:

如果您使用的是 java 版本 9+,请添加以下内容并删除 hibernate 核心依赖项,因为它已包含在 spring boot jpa starter 中。

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

【讨论】:

  • 它改变了错误,看看它现在所说的内容:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“securityConfig”的bean时出错:通过字段“myUserDetailsS​​ervice”表示不满足的依赖关系;
【解决方案3】:

移除 Hibernate 依赖,因为 spring-boot-starter-data-jpa 已经有了它。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.0.7.Final</version>
</dependency>

希望这可行:)

【讨论】:

  • 谢谢,它改变了错误,看看它现在所说的内容:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“securityConfig”的bean时出错:通过字段“myUserDetailsS​​ervice”表达的不满足的依赖关系;
  • 您必须在安全配置类的 getPasswordEncoder 方法之上添加@Bean 注解。 @Bean private PasswordEncoder getPasswordEncoder() { return new PasswordEncoder() { @Override public String encode(CharSequence charSequence) { return charSequence.toString(); } @Override public boolean matches(CharSequence charSequence, String s) { return true; } }; }
猜你喜欢
  • 2013-06-15
  • 2018-02-18
  • 2015-06-19
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多