Controller Class 中的@Autowired 服务 bean 无法识别这些方法
@Autowired service bean in Controller Class won't recognize the methods
我有这个 classes:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Autowired
private EntityManager entityManager;
@Override
public UserDetails loadUserByUsername( String username) throws UsernameNotFoundException {
Optional<User> userOptional = userRepository.findUserByUsername(username);
User user = userOptional.orElseThrow(
()->new UsernameNotFoundException("Username not found in the database")
);
return new MyUserDetails(user);
}
public void saveUser(User user){
User newUser=new User();
newUser.setUsername(user.getUsername());
newUser.setPassword(passwordEncoder.encode(user.getPassword()));
newUser.setEnabled(true);
newUser.setRoles(List.of(entityManager.find(Role.class,1)
));
userRepository.save(newUser);
}
public void deleteUser(User user){
userRepository.delete(user);
}
public UserDetails getCurrentlyLoggedUser(Authentication authentication){
Object principal = authentication.getPrincipal();
if(principal instanceof UserDetails){
String username=((User) principal).getUsername();
UserDetails loggedUser = loadUserByUsername(username);
return loggedUser;
}
return null;
}}
@Controller
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@Autowired
private final UserDetailsService userDetailsService;
@GetMapping("/orderlist")
public String showOrdeList(Model model, @AuthenticationPrincipal Authentication authentication){
userDetailsService.getCurrentlyLoggedUser
}
}
我想知道为什么 UserDetailsServiceImpl class 中的方法不会出现在控制器中...
我只能访问接口中的方法,而不能访问除它们之外实现的方法。
我尝试使用限定符,甚至做了一个配置 class 来在通过接口注入 bean 时实例化 impl class。
@Configuration
public class OrderConfig {
@Bean("userDetailsService")
public UserDetailsService userDetailsService() {
return new UserDetailsServiceImpl();
}
谁能告诉我我做错了什么?
无法访问 UserDetailsServiceImpl
中定义但未在 UserDetailsService
中定义的方法,因为您正在通过接口 UserDetailsService
注入服务并且编译器不知道将注入哪个实现在运行时。
因此,您需要定义自己的接口,其中包含您想要通过 class 公开或注入服务的所有方法。
@Autowired
private final UserDetailsServiceImpl userDetailsService;
我会推荐一个扩展 UserDetailsService
并使用您的自定义界面注入您的服务的自定义界面。
我有这个 classes:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@Autowired
private EntityManager entityManager;
@Override
public UserDetails loadUserByUsername( String username) throws UsernameNotFoundException {
Optional<User> userOptional = userRepository.findUserByUsername(username);
User user = userOptional.orElseThrow(
()->new UsernameNotFoundException("Username not found in the database")
);
return new MyUserDetails(user);
}
public void saveUser(User user){
User newUser=new User();
newUser.setUsername(user.getUsername());
newUser.setPassword(passwordEncoder.encode(user.getPassword()));
newUser.setEnabled(true);
newUser.setRoles(List.of(entityManager.find(Role.class,1)
));
userRepository.save(newUser);
}
public void deleteUser(User user){
userRepository.delete(user);
}
public UserDetails getCurrentlyLoggedUser(Authentication authentication){
Object principal = authentication.getPrincipal();
if(principal instanceof UserDetails){
String username=((User) principal).getUsername();
UserDetails loggedUser = loadUserByUsername(username);
return loggedUser;
}
return null;
}}
@Controller
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@Autowired
private final UserDetailsService userDetailsService;
@GetMapping("/orderlist")
public String showOrdeList(Model model, @AuthenticationPrincipal Authentication authentication){
userDetailsService.getCurrentlyLoggedUser
}
}
我想知道为什么 UserDetailsServiceImpl class 中的方法不会出现在控制器中... 我只能访问接口中的方法,而不能访问除它们之外实现的方法。 我尝试使用限定符,甚至做了一个配置 class 来在通过接口注入 bean 时实例化 impl class。
@Configuration
public class OrderConfig {
@Bean("userDetailsService")
public UserDetailsService userDetailsService() {
return new UserDetailsServiceImpl();
}
谁能告诉我我做错了什么?
无法访问 UserDetailsServiceImpl
中定义但未在 UserDetailsService
中定义的方法,因为您正在通过接口 UserDetailsService
注入服务并且编译器不知道将注入哪个实现在运行时。
因此,您需要定义自己的接口,其中包含您想要通过 class 公开或注入服务的所有方法。
@Autowired
private final UserDetailsServiceImpl userDetailsService;
我会推荐一个扩展 UserDetailsService
并使用您的自定义界面注入您的服务的自定义界面。