【发布时间】:2021-08-11 21:11:25
【问题描述】:
我是 Java spring 的新手,目前在我正在更新的代码中,有一个 UserDetailsDao 类我试图在另一个 java 文件中调用。
@Repository public class UserDetailsDao {
@Autowired
NamedParameterJdbcTemplate template; //blah blah functions}
这是我试图从 DAO 类文件中调用我需要的函数来获取的 java 文件:
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,并通过这里调用函数:
@Bean
public UserDetailsServiceImpl userDetailsService() {
return new UserDetailsServiceImpl();
}
或
@Autowired
private UserDetailsDao userDetailsDao;
当我进入 LoginAuthenticationSuccessHandler 类文件后调试应用程序的登录部分时,该类文件调用了此处的函数以获取用户的用户详细数据,无论我尝试了何种方式,UserDetailsDao 始终为空调用 DAO 类文件。这是我很困惑的地方,与代码中的另一个文件 UserDetailsServiceImpl 相比,该文件能够使用 UserDetailsDao 只需通过自动装配 at 并使用该 var 调用 DAO 中的函数,而 DAO iteslef 没有空值:
@Autowired
private UserDetailsDao userDetailsDao;
在它的类文件中。我已经厌倦了阅读各种注释,查找类似的错误,阅读其他示例,但似乎并没有牢记在心。我的猜测是它与注释以及我试图调用 DAO 的类文件 LoginAuthenticationSuccessHandler 有关。如果有人能指出我做错了什么并有一个链接可以让我了解更多信息。
【问题讨论】:
-
你试过用constructor injection代替
@Autowired吗? -
您声称能够使用
UserDetailsDao的另一个类是否带有例如注释?@Service或@Component有机会吗?我觉得可能是您缺少为此类提供 DAO 实例的情况,否则该实例将由 IoC 容器管理。 -
@ErikKarlstrand 所以另一个文件称为 UserDetailsServiceImpl 并实现了 UserDetailsService。在 UserDetailsServiceImpl 中,它在 Autowired 私有 UserDetailsDao userDetailsDao 处具有,并且在该类中还有其他调用 userDetailsDao 的函数,但它不为空。该类文件没有 at service 或 at component
-
@testItAll 你如何实例化 LoginAuthenticationSuccessHandler 类?
-
@maximus 所以这是我不明白的一部分,代码显示我看到它调用的唯一位置是在另一个类文件 WebSecurityConfig 中,它在 WebSecurityConfig 中扩展了 WebSecurityConfigurerAdapter 它有一个方法:public AuthenticationSuccessHandler successHandler(){ return new LoginAuthenticationSuccessHandler();} 然后在此 WebSecurityConfig 文件中的 protected void configure(HttpSecurity http) 中调用它。
标签: java spring spring-security