Vous gérez uniquement MySQLIntegrityConstraintViolationException et non d'autres exceptions :NestedServletException et DuplicateKeyException et, par conséquent, vous obtenez stacktrace et votre try/catch ne fonctionne pas.
BTW, pourquoi ne pas simplement créer une méthode supplémentaire pour vérifier si le nom d'utilisateur est déjà présent et si oui, afficher le message d'erreur sinon ajouter l'utilisateur.
class UserRepositoryImpl implements UserRepository{
//.....
public int isUsernameExist(String username){
String sql = "SELECT COUNT(*) FROM users WHERE username=?";
return jdbcTemplate.queryForObject(sql, new Object[] { username }, String.class);
}
//....
}
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegisterUser(@ModelAttribute("user") User user, BindingResult result){
int status = userRepository.isUserExist(user.getUsername());
if(status==1){
//Username exist... redirect and display error msg.
} else {
userRepository.addUser(user);
}
//.....
}