#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. Да, это то, что я в конце концов понял, и в итоге переместил это под контроллер, и это работает просто отлично