2017-02-28 2 views
0

arr配列にuserdetailsを追加すると、すべての要素が同じ値に変更されます。それを行う方法を説明してください。配列オブジェクトに同じ値を変更するjava

@Autowired UserDto userDto;

public ArrayList getAllUsers() throws commonException { 
     ArrayList<UserDto> arr = new ArrayList<>(); 
     Iterable<User> user = userRepository.findAll(); 
     for(User userDetails: user){ 
      userDto.setUsername(userDetails.getUsername()); 
       userDto.setEmail(userDetails.getEmail()); 
       userDto.setPassword(userDetails.getPassword()); 
       arr.add(userDto); 
     } 



     return arr; 
+1

あなたは配列またはコレクションにオブジェクトを追加すると、オブジェクトへの唯一の*参照*は、追加したオブジェクトのコピーではありませんされています。したがって、参照は常にそのオブジェクトの*現在の内容を参照します。 – RealSkeptic

答えて

1

あなたのコードは、あなたが実際に変数userDtoを宣言したことがないので、不完全であることが表示されたり、それが初期化されます。しかし、あなたの問題に対する解決策は、新しいUserDto POJOをそれぞれに初期化し、それぞれのループの繰り返しをにすることです。このような何か:

for (User userDetails: user) { 
    UserDto userDto = new UserDto();  // CRITICAL 
    userDto.setUsername(userDetails.getUsername()); 
    userDto.setEmail(userDetails.getEmail()); 
    userDto.setPassword(userDetails.getPassword()); 

    arr.add(userDto); 
} 

同じユーザーの複数のコピーで終わる理由は、現在、あなたは、単に各反復中にその値を変更し、同じUserDtoオブジェクトを再利用したということです。

0

毎回新しいオブジェクトを作成する必要がありますので、これをループに追加してください。

UserDto userDto = new UserDto(); 
0

あなたが最初UserDtoをインスタンス化する必要があります。

for(User userDetails: user){ 

    //You need to add this 
    UserDto userDto = new UserDto(); 

    userDto.setUsername(userDetails.getUsername()); 
    userDto.setEmail(userDetails.getEmail()); 
    userDto.setPassword(userDetails.getPassword()); 

    arr.add(userDto); 
} 
関連する問題