【问题标题】:Issue with DAO java file being called调用 DAO java 文件的问题
【发布时间】: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 类文件。这是我很困惑的地方,与代码中的另一个文件 UserDetailsS​​erviceImpl 相比,该文件能够使用 UserDetailsDao 只需通过自动装配 at 并使用该 var 调用 DAO 中的函数,而 DAO iteslef 没有空值:

@Autowired
private UserDetailsDao userDetailsDao;

在它的类文件中。我已经厌倦了阅读各种注释,查找类似的错误,阅读其他示例,但似乎并没有牢记在心。我的猜测是它与注释以及我试图调用 DAO 的类文件 LoginAuthenticationSuccessHandler 有关。如果有人能指出我做错了什么并有一个链接可以让我了解更多信息。

【问题讨论】:

  • 你试过用constructor injection代替@Autowired吗?
  • 您声称能够使用UserDetailsDao 的另一个类是否带有例如注释? @Service@Component 有机会吗?我觉得可能是您缺少为此类提供 DAO 实例的情况,否则该实例将由 IoC 容器管理。
  • @ErikKarlstrand 所以另一个文件称为 UserDetailsS​​erviceImpl 并实现了 UserDetailsS​​ervice。在 UserDetailsS​​erviceImpl 中,它在 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


【解决方案1】:

发生这种情况是因为您的LoginAuthenticationSuccessHandler 不是Bean,因此Spring 无法将另一个Bean 注入其中。在这种情况下,您应该将 UserDetailsDao bean 提供给 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;
    }
}

【讨论】:

  • 是的,这就是我最终想出的结果,并最终将其移到了控制器下,并且运行良好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2010-11-27
  • 2011-03-24
  • 2012-02-17
相关资源
最近更新 更多