SpringData调用UserManager时userRepository为null的问题求助
你遇到的两个null问题根源都是Spring容器的依赖注入规则没遵守:
- 手动
new UtenteServiceImpl时,Spring没法给这个实例注入userRepository,所以userRepository为null; - 去掉手动实例化后,
UserManager本身不是Spring管理的Bean,Spring没法给它注入userService,所以userService变成null。
解决步骤
- 把UserManager纳入Spring容器管理:给
UserManager类加@Component或@Service注解,让Spring负责它的实例化和依赖注入。 - 移除UserManager里的手动实例化代码:只保留
@Autowired声明UtenteService,让Spring自动注入实现类。 - 修正UtenteService接口的注解:接口不需要加
@Service,仅在实现类UtenteServiceImpl上保留该注解即可,避免Spring识别混乱。 - 修复Repository返回值不匹配问题:
UtenteRepository的findByEmail返回List<Utente>,但UtenteService的search方法返回Utente,直接强转会报错,需调整逻辑取有效元素。
修改后的代码
UserManager
package milligroup.models; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.provisioning.UserDetailsManager; import org.springframework.stereotype.Component; import milligroup.services.UtenteService; @Component public class UserManager implements UserDetailsManager{ @Autowired UtenteService userService; public void createUser(UserDetails userBean, String email) { userService.saveUser(new Utente(email, userBean.getUsername(), userBean.getPassword())); } @Override public void deleteUser(String email) { Utente u = userService.search(email); if(u != null) { userService.delete(u); } } @Override public void changePassword(String oldPassword, String newPassword) { } @Override public boolean userExists(String email) { Utente u = userService.search(email); return u != null; } @Override public void createUser(UserDetails user) { // TODO Auto-generated method stub } @Override public void updateUser(UserDetails user) { //chiama service } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // TODO Auto-generated method stub return null; } }
UtenteService
package milligroup.services; import milligroup.models.Utente; public interface UtenteService{ Utente saveUser(Utente u); Utente search(String email); void delete(Utente u); }
UtenteServiceImpl
package milligroup.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import milligroup.models.Utente; import milligroup.models.UtenteRepository; @Service public class UtenteServiceImpl implements UtenteService{ @Autowired private UtenteRepository userRepository; @Override public Utente saveUser(Utente u) { return userRepository.save(u); } @Override public Utente search(String email) { List<Utente> userList = userRepository.findByEmail(email.toLowerCase()); return userList.isEmpty() ? null : userList.get(0); } @Override public void delete(Utente u) { userRepository.delete(u); } }
UtenteRepository(无需修改)
package milligroup.models; import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface UtenteRepository extends CrudRepository<Utente, Long>{ @Query("select u from Utente u where lower(u.email) = :searchTerm") List<Utente> findByEmail(@Param("searchTerm") String searchTerm); }
修改完成后,Spring会自动管理所有Bean的依赖注入,userService和userRepository都不会再出现null,同时也修复了返回值不匹配的潜在问题。
内容的提问来源于stack exchange,提问作者user28801942
相关产品推荐
相关产品推荐

