从Spring4中的服务访问Repository时出现NullPointerException

问题描述:

我试图将用户数据通过其余控制器保存到使用服务和存储库的数据库中。从Spring4中的服务访问Repository时出现NullPointerException

控制器

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

我发送POST请求这个http://localhost:8080/users/create URL以如下数据

{ 
    "username": "testusername", 
    "password": "password123", 
    "passwordRepeat": "password123", 
    "email": "[email protected]", 
    "emailRepeat": "[email protected]" 
} 

这里是例外,我是说我这样做,

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) 

我不能在这里找出原因。请帮忙。

+0

私人UserService userService使其自动装配 –

+1

我认为你的'编码器'没有初始化,所以自动装配它 – Afridi

+0

@DeedarAliBrohi服务已经自动装配了。问题在于编码器。 – Harshakj89

这不会发生,因为您正在访问存储库,但因为您正在使用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可用。

+0

谢谢。为我节省了很多时间。系统不允许我接受这个答案或者投票。我会在稍后再做。 – Harshakj89