when I put a gap between quotation marks " " I have ArrayIndexOutOfBoundsException and when I close quotation marks "" inside the split it shows on my board the first letter of firstname and the first letter of lastname.More spesific the console shows problem in (UserServiceImpl.java:68),(UserServiceImpl.java:60),(UserServiceImpl.java:61),(AuthController.java:60)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private Long id;
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
@NotEmpty(message = "Email should not be empty")
@Email
private String email;
@NotEmpty(message = "Password should not be empty")
private String password;
}
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "users")
public class User {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String password;
@Column(nullable = false,unique = true)
private String email;
@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
@JoinTable(
name = "users_roles",joinColumns = {@JoinColumn(name = "USER_ID",referencedColumnName = "ID")},
inverseJoinColumns = {@JoinColumn(name = "ROLE_ID",referencedColumnName = "ID")})
private List<Role> roles = new ArrayList<>();
}
@Service
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
private RoleRepository roleRepository;
private PasswordEncoder passwordEncoder;
public UserServiceImpl(UserRepository userRepository,
RoleRepository roleRepository,
PasswordEncoder passwordEncoder) {
this.userRepository = userRepository;
this.roleRepository = roleRepository;
this.passwordEncoder = passwordEncoder;
}
@Override
public void saveUser(UserDto userDto) {
User user = new User();
user.setName(userDto.getFirstName() + " " + userDto.getLastName());
user.setEmail(userDto.getEmail());
//encrypt the password once we integrate spring security
//user.setPassword(userDto.getPassword());
user.setPassword(passwordEncoder.encode(userDto.getPassword()));
Role role = roleRepository.findByName("ROLE_ADMIN");
if(role == null){
role = checkRoleExist();
}
user.setRoles(Arrays.asList(role));
userRepository.save(user);
}
@Override
public User findByEmail(String email) {
return userRepository.findByEmail(email);
}
@Override
public List<UserDto> findAllUsers() {
List<User> users = userRepository.findAll();
return users.stream().map((user) -> convertEntityToDto(user))
.collect(Collectors.toList());
}
private UserDto convertEntityToDto(User user) {
UserDto userDto = new UserDto();
String[] name = user.getName().split(" ");
userDto.setFirstName(name[0]);
userDto.setLastName(name[1]);
userDto.setEmail(user.getEmail());
return userDto;
}
private Role checkRoleExist() {
Role role = new Role();
role.setName("ROLE_ADMIN");
return roleRepository.save(role);
}
}
@Controller
public class AuthController {
private UserService userService;
public AuthController(UserService userService) {
this.userService = userService;
}
@PostMapping("/register/save")
public String registration(@Valid @ModelAttribute("user") UserDto user,
BindingResult result,
Model model) {
User existing = userService.findByEmail(user.getEmail());
if (existing != null) {
result.rejectValue("email", null, "There is already an account registered with that email");
}
if (result.hasErrors()) {
model.addAttribute("user", user);
return "register";
}
userService.saveUser(user);
return "redirect:/register?success";
}
@GetMapping("/users")
public String listRegisteredUsers(Model model){
List<UserDto> users = userService.findAllUsers();
model.addAttribute("users", users);
return "users";
}
}
>Solution :
The user name
field may not have a space in it, i.e. has just one component, in which case referencing the second element of the array after splitting would result in an ArrayIndexOutOfBoundsException
. Try catering to this possibility to avoid the error.
private UserDto convertEntityToDto(User user) {
UserDto userDto = new UserDto();
String[] names = user.getName().split(" ");
userDto.setFirstName(names[0]);
userDto.setLastName(names.length > 1 ? names[1] : "");
userDto.setEmail(user.getEmail());
return userDto;
}