即使添加装饰器,Bean 实例仍然有空值@service



I 得到了 bean CustomUserDetailsServiceImpl 的空异常。 在我的整个应用程序中,只有这个类实现了CustomUserDetailsService。 然而,春天似乎仍然无法装载豆子。

知道吗?

身份验证.java

CustomUserDetailsService userService = (CustomUserDetailsService) SpringApplicationContext.getBean("CustomUserDetailsServiceImpl");

CustomUserDetailsServiceImpl.java

@Service
public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
@Autowired
private UsersRepository userRepository;

@Autowired
BCryptPasswordEncoder bCryptPasswordEncoder;
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {  
........
}

入门级

@SpringBootApplication
public class XprojApplication {
public static void main(String[] args) {
SpringApplication.run(XprojApplication.class, args);
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SpringApplicationContext springApplicationContext()
{
return new SpringApplicationContext();
}

@Bean(name="AppProperties")
public AppProperties getAppProperties()
{
return new AppProperties();
}

}

文件夹结构

./
├── SpringApplicationContext.java
├── XprojApplication.java
├── dto
│   ├── Metadata.java
│   ├── QueryFilter.java
│   ├── RealEstateTransaction.java
│   ├── TransactionDTO.java
│   └── UserDto.java
├── exceptions
│   └── UserServiceException.java
├── model
│   ├── CustomUserDetails.java
│   ├── RoleEntity.java
│   └── UserEntity.java
├── repository
│   ├── TransactionJpaRepo.java
│   └── UsersRepository.java
├── request
│   ├── LoginRequestModel.java
│   ├── UserDetailsRequestModel.java
│   └── UserLoginRequestModel.java
├── resource
│   ├── AppController.java
│   ├── AuthenticationController.java
│   └── UserController.java
├── response
│   └── UserRest.java
├── security
│   ├── AppProperties.java
│   ├── AuthenticationFilter.java
│   ├── AuthorizationFilter.java
│   ├── SecurityConstants.java
│   └── WebSecurityConfiguration.java
└── service
├── CustomUserDetailsService.java
├── CustomUserDetailsServiceImpl.java
├── RealEstateTransactionService.java
└── RealEstateTransactionServiceImpl.java

尝试使用小写的"c"=>"customUserDetailsServiceImpl",即使用配置弹簧默认值的约定

CustomUserDetailsService userService = (CustomUserDetailsService) SpringApplicationContext.getBean("customUserDetailsServiceImpl");

明确命名 Bean

@Service("customUserDetailsServiceImplBean")
public class CustomUserDetailsServiceImpl implements CustomUserDetailsService {
...
}
CustomUserDetailsService userService = (CustomUserDetailsService) SpringApplicationContext.getBean("customUserDetailsServiceImplBean");

您没有提供太多关于上下文如何准确配置以及此处SpringApplicationContext的内容的详细信息,因此我将在此处仅提供一般要点:

  1. Spring 可能不会扫描CustomUserDetailsServiceImpl所在的包裹。 当 spring 启动应用程序上下文时,它应该以某种方式知道你把 bean 放在哪里(在哪些目录中(。当您加载弹簧时指定(或者如果您使用的是弹簧( 启动它对此有一些预定义的规则,但我没有看到您使用 spring boot(。 然后它扫描包并尝试从那里解析 bean。如果包不在要扫描的包中,显然不会创建 bean。

  2. 将扫描包,但无法创建 BeanCustomUserDetailsServiceImpl,因为它自己的依赖项之一未解析。在这种情况下,应用程序上下文启动过程将失败,您将在日志中看到大量消息。

  3. 加载
  4. Bean 并启动应用程序上下文,但是当您通过以下方式引用它时:CustomUserDetailsService userService =(CustomUserDetailsService)SpringApplicationContext.getBean("CustomUserDetailsServiceImpl");然后出现问题,你会得到 null。在这种情况下,名称(并且方法调用实际上是按名称调用 bean(是错误的。我建议你改用 get bean by id 功能(顺便说一下,它会避免丑陋的投射(:

    CustomUserDetailsService userService = SpringApplicationContext.getBean(CustomUserDetailsService.class);
    

相关内容

最新更新