2016-02-12 4 views
0

Я реализую безопасность в приложении весенней загрузки и получаю исключение StackOverflow. У меня есть пользовательское pojo и репозиторий для сохранения пользователя в DB, ​​который работает нормально.spring security StackOverflow Error

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ 

    @Autowired 
    private UserDetailsService userDetailsService; 
    .... 
    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
     .userDetailsService(userDetailsService); } 

и

public class User { 

    private String password; 

    public User(User user) { 
     this.password = user.password; 
     ... 
    } 

    public String getPassword() { 
     return password; 
    } 

ожидает GetPassword пользователя(), чтобы получить колл ниже, но не происходит -

public class MyUserDetails extends User implements UserDetails{ 
    ........ 
    @Override 
    public String getPassword() { 
     return getPassword(); 
} 

Реализация UserDetailsService -

@Override 
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 
    User user = userRepository.findByEmail(email); 
    if (user == null) 
     throw new UsernameNotFoundException("no " + email); 
    return new MyUserDetails(user); 
} 

У меня есть inserte d один пользователь/пароль в БД, вызывая userRepository.save (пользователь). Когда я пытаюсь передать недействительный пользователь/пароль, он корректно возвращает неверное сообщение пользователя. Но когда я пытаюсь с пользователя/пароль хранится в БД я получаю следующее исключение -

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause 

java.lang.StackOverflowError: null 
    at com.xyz.MyUserDetails.getPassword(MyUserDetails.java:27) ~[classes/:na] 

ответ

1

Взглянув на MyUserDetails.getPassword() метод, вы можете увидеть, что он будет называть себя ... бесконечно ...

public class MyUserDetails extends User implements UserDetails{ 
    ........ 
    @Override 
    public String getPassword() { 
     return getPassword(); // <= infinite recursion here 
} 

Возможно, есть переменная с похожим именем, которое вы хотели бы вернуть, или, может быть, вызывать другой метод (из суперкласса .. или нет ..)?

+0

обновил мое сообщение с помощью класса пользователя, который имеет метод getPassword. – chappalprasad

+0

@chappalprasad Почему вы переписываете метод 'getPassword()' в 'MyUserDetails'? Поскольку он определен как открытый в классе 'User', его можно просто получить, не требуя какой-либо конкретной обработки. – Morfic

+0

Да, я сделал некоторый прогресс. вызывая super.getPassword(), но вы правы, можете просто удалить аннотацию переопределения. В обоих случаях теперь я получаю эту ошибку - Причина: Нет enum constant com.xyz.resource.Role.ROLE_USER
. Я использую Enum Role как часть USER с двумя значениями - USER, ADMIN. – chappalprasad

Смежные вопросы