2017-07-03 18 views
0

ユーザーデータを保存しようとしています。サービスとリポジトリを使用して、残りのコントローラ経由でデータベースに送信しています。Spring4のサービスからリポジトリにアクセスするときに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); 
    } 
} 

私は以下のデータ

この http://localhost:8080/users/create URLにPOSTリクエストを送信してい

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

リポジトリここでは

は私がそうするとき、

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 autowired –

+1

あなたの 'エンコーダ'は初期化されていないと思いますので、autowire – Afridi

+0

@DeedarAliBrohiサービスは既にautowiredです。エンコーダに問題がありました。 – Harshakj89

答えて

1

BCryptPasswordEncoderはautowiredではありませんが、encoder.encode()を使用しているため、これはリポジトリにアクセスしているためではありません。

あなたは、次のフィールドがあります。

private UserRepository userRepository; 
private BCryptPasswordEncoder encoder; 

をしかし、あなたは一つだけをautowired:あなたは

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

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

だから、あなたはあなたのコンストラクタを変更して、それを修正することができますしかし、BCryptPasswordEncoderのBeanを用意する必要があります。

+0

ありがとう。多くの時間を節約しました。システムでは、これを回答として受け入れるか、投票することはできません。後でやります。 – Harshakj89

関連する問題