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
的内容的详细信息,因此我将在此处仅提供一般要点:
-
Spring 可能不会扫描
CustomUserDetailsServiceImpl
所在的包裹。 当 spring 启动应用程序上下文时,它应该以某种方式知道你把 bean 放在哪里(在哪些目录中(。当您加载弹簧时指定(或者如果您使用的是弹簧( 启动它对此有一些预定义的规则,但我没有看到您使用 spring boot(。 然后它扫描包并尝试从那里解析 bean。如果包不在要扫描的包中,显然不会创建 bean。 -
将扫描包,但无法创建 Bean
CustomUserDetailsServiceImpl
,因为它自己的依赖项之一未解析。在这种情况下,应用程序上下文启动过程将失败,您将在日志中看到大量消息。
加载 Bean 并启动应用程序上下文,但是当您通过以下方式引用它时:
CustomUserDetailsService userService =(CustomUserDetailsService)SpringApplicationContext.getBean("CustomUserDetailsServiceImpl");
然后出现问题,你会得到 null。在这种情况下,名称(并且方法调用实际上是按名称调用 bean(是错误的。我建议你改用 get bean by id 功能(顺便说一下,它会避免丑陋的投射(:CustomUserDetailsService userService = SpringApplicationContext.getBean(CustomUserDetailsService.class);