我有一个带注释驱动配置的spring webapp。
所有控制器,存储库都是自动装配的。
在集成Spring Security时,我定义了一个单独的security-app.xml。我创建了一个名为LoginUserService的服务,它实现了UserDetailsService。现在调用此类的方法loadUserByUsername()方法进行身份验证。
此类具有UserRepository的自动连接依赖项。现在这个自动连接的依赖关系变成了null。为了解决这个问题,我启用了注释驱动配置,并在组件扫描配置中添加了存储库类的包名称。
此处还讨论了此解决方案 spring security with custom user details
但现在的问题是UserRepository有一个带有@PersistenceContext注释的EntityManager字段。对于spring安全配置,它能够找到UserRepository但无法找到实体管理器。我应该在这里创建一个新的EntityManagerFactory吗?我想这将在我的应用程序中创建两个持久性单元?
如何将自动连接的依赖项注入使用原始servlet xml创建的UserRepository?
更新
这里简要讨论一下: https://stackoverflow.com/a/7078395/161628
但我想一个规范的详细答案对我来说会更有用。
更新
如何使用ApplicationContext在运行时获取UserRepository?
if (userRepository == null) {
userRepository = ApplicationContextProvider.getApplicatonContext().getBean(UserRepository.class);
}
答案 0 :(得分:1)
编辑:您在DispatcherServlet的配置中声明的Bean将无法用于您在contextConfigLocation配置文件中声明或组件扫描的任何Bean。因此,在这种情况下,如果您在为DispatcherServlet加载的配置文件中设置JPA配置,则无法将其连接到您在安全配置中声明的bean。您需要将任何“核心”bean配置(数据源配置,数据库连接池配置,JPA / Hibernate配置,存储库/服务组件扫描等)移动到您通过contextConfigLocation加载的配置文件中。然后,这些东西将可用于您的安全bean和您的MVC bean。我认为通常的想法是只在DispatcherServlet配置中加载MVC特定的bean(例如控制器,视图,请求处理程序,请求范围的bean等)。这样,您可以确保在MVC代码和非MVC代码之间实现清晰的分离,只需要从MVC代码到“核心”代码的单向依赖关系,并且在“核心”代码中不依赖于MVC代码。这有助于使您的代码更加模块化,并且可以更轻松地以其他方式重用“核心”代码,特别是在单元测试中。
(原始评论文本询问如何加载安全配置,如果它在contextConfigLocation或其他地方。)