【问题标题】:NullPointerException when accessing Repository from the Service in Spring4 [duplicate]在 Spring4 中从服务访问存储库时出现 NullPointerException [重复]
【发布时间】:2017-07-03 12:24:43
【问题描述】:

我正在尝试使用服务和存储库将通过 rest 控制器发送的用户数据保存到数据库。

控制器

@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)

我不知道这里的原因。请帮忙。

【问题讨论】:

  • private UserService userService 使其自动连接
  • 我认为你的“编码器”没有初始化,所以自动装配它
  • @DeedarAliBrohi 服务已经自动连接。问题出在编码器上。
  • @P.J.Meisch 我非常不同意,因为这个异常与 Spring 有关
  • @Harshakj89 不是真的,你没有初始化它,简单的调试就会发现。你使用 spring 在这里并不重要。

标签: java spring spring-boot repository


【解决方案1】:

这不是因为您正在访问存储库,而是因为您使用的是encoder.encode(),即使BCryptPasswordEncoder 没有自动连接。

您有以下字段:

private UserRepository userRepository;
private BCryptPasswordEncoder encoder;

但你只自动装配了一个:

@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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2016-11-30
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多