Spring中/register接口POST请求出现NullPointerException:service为null
解决SecurityController中UserService注入为null的NullPointerException问题
问题描述
调用/register端点发送POST请求时,抛出NullPointerException,报错提示service对象为null。相关代码如下:
SecurityController代码
@AllArgsConstructor @RestController @Validated public class SecurityController { private final UserService service; @PostMapping("/register") private ResponseEntity<UserDTO> registerUser (@RequestBody @Valid RegisterDTO registerDTO) { return ResponseEntity.created(URI.create("/user")).body(service.createUser(registerDTO)); } }
UserService代码
@RequiredArgsConstructor @Service public class UserService implements UserServiceApi { private final UserRepository userRepository; private final RoleRepository roleRepository; private final PasswordEncoder encoder; @Override public UserDTO createUser(RegisterDTO user) { if (user.equals(userRepository.findByUsername(user.getUsername()))) { throw new RuntimeException("This nickname is already taken"); } if (user.equals(userRepository.findByEmail(user.getEmail()))) { throw new RuntimeException("This email is already taken"); } // Encoding password user.setPassword(encoder.encode(user.getPassword())); // On creating new Account it's going to have USER role Role role = roleRepository.findByName("USER"); String username = user.getUsername(); String password = user.getPassword(); String email = user.getEmail(); User dto = buildUser(username, password, email, role); userRepository.save(dto); return UserDTO.builder() .username(username) .password(password) .email(email) .build(); } }
UserController代码
@RestController(value = "/user") @AllArgsConstructor @Validated public class UserController { private final UserService service; @GetMapping("/getusers") public ResponseEntity<List<User>> getAllUser() { return ResponseEntity.ok(service.getUsers()); } }
问题原因分析
- SecurityController请求方法权限错误:
registerUser方法被定义为private,Spring MVC无法识别并调用私有方法处理HTTP请求,导致SecurityController实例未被Spring正确初始化,依赖注入的UserService无法赋值,最终为null。 - UserController路径配置错误:
@RestController(value = "/user")中的value属性是用来指定Bean名称的,并非请求路径前缀,这个错误会导致/user/getusers路径无法正确映射,但不是当前NPE的直接原因,需一并修正。
解决方案
1. 修正SecurityController方法权限
将registerUser方法的访问权限改为public,确保Spring MVC能正常调用:
@PostMapping("/register") public ResponseEntity<UserDTO> registerUser (@RequestBody @Valid RegisterDTO registerDTO) { return ResponseEntity.created(URI.create("/user")).body(service.createUser(registerDTO)); }
2. 修正UserController路径配置
使用@RequestMapping指定请求路径前缀,替换错误的@RestController(value = "/user"):
@RestController @RequestMapping("/user") @AllArgsConstructor @Validated public class UserController { private final UserService service; @GetMapping("/getusers") public ResponseEntity<List<User>> getAllUser() { return ResponseEntity.ok(service.getUsers()); } }
3. 额外检查项
- 确认项目Lombok依赖配置正确,
@AllArgsConstructor、@RequiredArgsConstructor等注解能正常生成构造方法,保证依赖注入生效。 - 确认
UserService所在包被Spring组件扫描覆盖(@SpringBootApplication默认扫描启动类所在包及其子包)。
内容的提问来源于stack exchange,提问作者huga721
相关产品推荐
相关产品推荐

