2017-07-03 3 views
0

J'essaie de sauvegarder les données utilisateur via le contrôleur de repos vers la base de données en utilisant un service et un référentiel.NullPointerException lors de l'accès au Repository à partir du Service dans Spring4

Contrôleur

@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

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

dépôt

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

J'envoie une requête POST à ​​cette url http://localhost:8080/users/create avec les données ci-dessous

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

Voici l'exception que je reçois quand je le fais,

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) 

Je ne peux pas comprendre la raison ici. aidez s'il vous plaît.

+0

userService utilisateur userService rendre autowired –

+1

Je pense que votre 'encoder' n'est pas initialisé, alors autowire il – Afridi

+0

@DeedarAliBrohi service était déjà autowired. Le problème était avec l'encodeur. – Harshakj89

Répondre

1

Cela ne se produit pas parce que vous accédez à un référentiel, mais parce que vous utilisez encoder.encode() même si BCryptPasswordEncoder n'est pas auto-initialisé.

Vous avez les champs suivants:

private UserRepository userRepository; 
private BCryptPasswordEncoder encoder; 

Mais vous autowired seul:

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

Ainsi, vous pouvez le réparer en changeant votre constructeur à:

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

Vous besoin d'avoir un haricot BCryptPasswordEncoder disponible cependant.

+0

Merci. M'a sauvé beaucoup de temps. Le système ne me permet pas d'accepter ceci comme réponse ou voter. Je le ferai plus tard. – Harshakj89