java - Spring4中从Service访问Repository时出现NullPointerException

标签 java spring spring-boot repository

我正在尝试使用服务和存储库将通过休息 Controller 发送的用户数据保存到数据库。

Controller

@RestController
@RequestMapping(path="/users")
public class UserController {

    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping(method= RequestMethod.POST, path="/create" )
    @ResponseStatus(HttpStatus.CREATED)
    @ResponseBody
    public void createUser(@RequestBody @Validated UserDto userDto ){

        userService.createUser(userDto.getUsername(), userDto.getEmail(), userDto.getPassword());

    }
}

服务

@Service
public class UserService {

    private UserRepository userRepository;
    private BCryptPasswordEncoder encoder;

    @Autowired
    public UserService(UserRepository userRepository){
        this.userRepository = userRepository;
    }

    public void createUser(String username, String email,String password){

        userRepository.save(new User(username, email, encoder.encode(password))); //line 25
    }

    public Optional<User> getByUsername(String username){
        return userRepository.findByusername(username);
    }
}

存储库

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    Optional<User> findByusername(String username);
}

我正在向此 http://localhost:8080/users/create 发送 POST 请求带有以下数据的网址

{
  "username": "testusername",
  "password": "password123",
  "passwordRepeat": "password123",
  "email": "asd@gm.com",
  "emailRepeat": "asd@gm.com"
}

这是我这样做时遇到的异常,

java.lang.NullPointerException: null
    at com.mportal.ec.services.UserService.createUser(UserService.java:25)
    at com.mportal.ec.web.UserController.createUser(UserController.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

我无法弄清楚这里的原因。请帮忙。

最佳答案

发生这种情况并不是因为您正在访问存储库,而是因为您正在使用 encoder.encode(),即使 BCryptPasswordEncoder 未 Autowiring 。

您有以下字段:

private UserRepository userRepository;
private BCryptPasswordEncoder encoder;

但是您只 Autowiring 了一个:

@Autowired
public UserService(UserRepository userRepository){
    this.userRepository = userRepository;
}

因此,您可以通过将构造函数更改为来修复它:

@Autowired
public UserService(UserRepository userRepository, BCryptPasswordEncoder encoder) {
    this.userRepository = userRepository;
    this.encoder = encoder; // This line is missing
}

不过,您需要有一个可用的 BCryptPasswordEncoder bean。

关于java - Spring4中从Service访问Repository时出现NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44885539/

相关文章:

java - 在 Spark 中将时间戳转换为纪元 (Java)

java - Spring security 在 AWS ThinkPHP 请求上部署了应用程序

java - 在具有泛型参数的泛型方法中使用 Spring RestTemplate

java - 迷宫求解器 ArrayIndexOutOfBoundsException

java - 如何修复JNI项目无法运行的问题

java - Playframework 中的 ConcurrentModificationException

java - 使用ajax加载弹出窗口

java - 使用 Spring Boot Java 嵌入 Grizzly (glassfish) Servlet 容器

Java/Springboot : Catch and handle a particular exception in one place?

java - 通过带有 Spring 数据的日期进行对象恢复