Java Bean bị IllegalStateException: EntityManagerFactory is closed

Trong SecurityConfig:

            @Bean
            public PasswordEncoder passwordEncoder() {
                // Password encoder, để Spring Security sử dụng mã hóa mật khẩu người dùng
                return new BCryptPasswordEncoder();
            }

Nhưng trong UserController:

    @Autowired
    PasswordEncoder encoder; // Nên sửa thành passwordEncoder

Kết quả là cậu sẽ bị nhắc khéo “bean kiểu PasswordEncoder không thể được tìm thấy”.

Vì Spring sử dụng bean name làm default qualifier, nên cậu cần viết đúng tên của encoder trong UserController.

6 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3


Mình đã sửa y như v nhưng nó vẫn báo Field passwordEncoder not found cậu ạ

1 Like

Oh, vậy cậu thử thế này trong UserController xem:

    @Resource(name = "passwordEncoder")
    PasswordEncoder passwordEncoder;
1 Like
Description:

A component required a bean named 'passwordEncoder' that could not be found.


Action:

Consider defining a bean named 'passwordEncoder' in your configuration.

Đây là lỗi mà tôi gặp phải sau khi dùng

@Resource(name = "passwordEncoder")
    PasswordEncoder passwordEncoder;
1 Like

Hm, có vẻ như configuration của cậu không scan được package pvars.arsenalquan.controllers (do nó ở pvars.arsenalquan.config).
Ngoài thay đổi ở trên, cậu thử thêm @ComponentScan annotation vào SecurityConfig xem.

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = "pvars.arsenalquan.controllers")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
1 Like

Có vẻ nó không có tác dụng

1 Like

Cậu có thể push code của cậu lên git và share được không? Thường config mấy application sử dụng Spring khá tốn công, và cần đọc nhiều thứ trong source code.

1 Like

Được chứ, đây là source git của tôi, cám ơn bạn nhiều

2 Likes

b thử bỏ đoạn

@Autowired
PasswordEncoder passwordEncoder;

trong class SecurityConfig đi xem
bạn bean nó ở

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder(); // Password encoder, để Spring Security sử dụng mã hóa mật khẩu người dùng
}

rồi mà

mình có thử cách này mà không được, vẫn chưa hiểu vì sao

nhưng chắc chắn ông phải xóa @autowired thằng này trong file kia, nó mới chuẩn.

ông dumb file.sql ra cho tôi đc k? structure & data nhse


bỏ đi thêm lam gi vây -…-

Bỏ nó lỗi mà ko bỏ nó cũng lỗi nên em chưa xoá đấy

vẫn lỗi ấy bro, bro nào thử đoạn code ở git trên chưa ạ?

Còn cách khác là inject bean bằng constructor

  • Bỏ Autowired PasswordEncoder đi
  • Thêm constructor cho controller như sau
private final PasswordEncoder passwordEncoder;

public UserController(PasswordEncoder passwordEncoder) {
    this.passwordEncoder = passwordEncoder;
}

Hoặc config bean paswordEncoder trong BackendArsenalquanApplication.java thay vì SecurityConfig.java

3 Likes

Ủa ủa, project mình clone về vẫn chạy ầm ầm mà, có lỗi gì đâu nhỷ.

//    @Autowired
//    UserService userService;
//
//    @Autowired
//    PasswordEncoder passwordEncoder;

//    @Override
//    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//        auth.userDetailsService(userService) // Cung cáp userservice cho spring security
//                .passwordEncoder(encoder()); // cung cấp password encoder
//    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder(); // Password encoder, để Spring Security sử dụng mã hóa mật khẩu người dùng
    }
  • UserController nè:
public class UserController {

    @Autowired
    UserRepository userRepository;

    @Autowired
    PasswordEncoder passwordEncoder;
2 Likes

Cám ơn bạn nha, mình cũng ko rõ sao nó lỗi nữa, để mình build lại xem sao, mình kiểu buổi sáng chạy ok xong tối về nó tự dưng lỗi ấy

Nếu vẫn còn bị thì bạn thử build và chạy thủ công xem
mvn clean package && java -jar target\<app-name>.jar

2 Likes

Giải pháp của mình là xoá project và build lại, đã thành công, cám ơn mọi người

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?