You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
    }
}

问题原因分析

  1. SecurityController请求方法权限错误:registerUser方法被定义为private,Spring MVC无法识别并调用私有方法处理HTTP请求,导致SecurityController实例未被Spring正确初始化,依赖注入的UserService无法赋值,最终为null。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:50:36