Проблема с вызовом java-файла DAO

#java #spring #spring-security

Вопрос:

Я новичок в Java spring, и в настоящее время в коде, который я обновляю, есть класс UserDetailsDao, который я пытаюсь вызвать в другом файле java.

 @Repository public class UserDetailsDao {
@Autowired
NamedParameterJdbcTemplate template; //blah blah functions}
 

Это файл java, который я пытаюсь вызвать функцию, необходимую мне из файла класса DAO, чтобы получить:

 public class LoginAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler{

public final Integer SESSION_TIMEOUT_IN_SECONDS = 7500;
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

@Override
public void onAuthenticationSuccess(HttpServletRequest request,
                                    HttpServletResponse response,
                                    Authentication authentication)
                                    throws ServletException, IOException {
    
    HttpSession session = request.getSession();
    session.setMaxInactiveInterval(SESSION_TIMEOUT_IN_SECONDS);
    
    String redirectPath = "/";
    
    User u = new User();
    
    //UserDetailsDao userDetailsDao = new UserDetailsDao();
   
   // u = userDetailsDao.getUserDetailedInfo(request.getParameter("username"));
   //gimme my data!
    UserDetailsServiceImpl utest = userDetailsService();
    u = utest.getUserDetails(request.getParameter("username"));
    request.setAttribute("user", u);
    
    redirectStrategy.sendRedirect(request, response, redirectPath);
}
 

}

Я устал вызывать компонент служебного файла imp, в котором работает эта настройка, и вызывать функции здесь:

     @Bean
public UserDetailsServiceImpl userDetailsService() {
    return new UserDetailsServiceImpl();
}
 

или

 @Autowired
private UserDetailsDao userDetailsDao;
 

Когда я отлаживаю часть входа в систему приложения, как только я попадаю в файл класса LoginAuthenticationSuccessHandler, в котором есть вызов функции здесь, чтобы получить подробные данные пользователя, UserDetailsDao всегда равен нулю, независимо от различных способов, которыми я пытаюсь вызвать файл класса DAO. Вот где я так запутался, по сравнению с другим файлом в коде, UserDetailsServiceImpl , который может использовать UserDetailsDao, просто подключив at и используя этот var для вызова функций в DAO без значения null для элемента DAO.:

 @Autowired
private UserDetailsDao userDetailsDao;
 

в файле его класса. Я устал читать различные аннотации, искать похожие ошибки, читать другие примеры, и это, похоже, не укладывается у меня в голове. Я предполагаю, что это как-то связано с аннотациями, а также с файлом класса LoginAuthenticationSuccessHandler, в котором я пытаюсь вызвать DAO. Если бы кто-нибудь мог указать мне, что я делаю неправильно, и дать ссылку на что-нибудь, где я мог бы узнать больше.

Комментарии:

1. Вы пробовали вместо этого использовать инъекцию конструктора @Autowired ?

2. Является ли другой класс, который вы утверждаете, может использоваться UserDetailsDao с аннотациями, например @Service , или @Component случайно? У меня такое чувство, что это может быть случай, когда вам не хватает предоставить этому классу экземпляр вашего DAO, которым в противном случае управлял бы контейнер IoC.

3. @ErikKarlstrand, поэтому другой файл называется UserDetailsServiceImpl и реализует UserDetailsService. В UserDetailsServiceImpl у него есть автоматически подключенный частный UserDetailsDao userDetailsDao, и в этом классе есть другие функции, которые вызывают userDetailsDao без значения null. Этот файл класса не имеет службы at или компонента at

4. @testItAll как создать экземпляр класса LoginAuthenticationSuccessHandler?

5. @maximus так что это одна часть, которую я не понимаю, код показывает, что единственное место, где я вижу, как он вызывается, находится в другом файле класса WebSecurityConfig, который расширяет WebSecurityConfigurerAdapter в WebSecurityConfig, в нем есть метод: public AuthenticationSuccessHandler successHandler(){ возвращает новую аутентификацию входа в систему successHandler();} затем он вызывается в защищенной конфигурации void(HttpSecurity http), который также находится в этом файле WebSecurityConfig.

Ответ №1:

Это происходит потому, что ваша LoginAuthenticationSuccessHandler пружина не является Bean пружиной, поэтому вы не можете ввести Bean в нее другую. В этом сценарии вы должны предоставить свой UserDetailsDao компонент LoginAuthenticationSuccessHandler классу, например:

 @EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsDao userDetailsDao;

    public AuthenticationSuccessHandler successHandler(){
        return new LoginAuthenticationSuccessHandler(this.userDetailsDao);
    }
}
 

И

 public class LoginAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

    private final UserDetailsDao userDetailsDao;

    public LoginAuthenticationSuccessHandler(UserDetailsDao userDetailsDao) {
        this.userDetailsDao = userDetailsDao;
    }
}
 

Комментарии:

1. Да, это то, что я в конце концов понял, и в итоге переместил это под контроллер, и это работает просто отлично