Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring Security的自动连线依赖项注入_Java_Spring_Hibernate_Dependency Injection_Spring Security - Fatal编程技术网

Java 使用Spring Security的自动连线依赖项注入

Java 使用Spring Security的自动连线依赖项注入,java,spring,hibernate,dependency-injection,spring-security,Java,Spring,Hibernate,Dependency Injection,Spring Security,我有一个带有注释驱动配置的SpringWebApp 所有控制器、存储库都是自动连接的 在集成Spring Security时,我定义了一个单独的Security-app.xml。我创建了一个名为LoginUserService的服务,它实现了UserDetailsService。现在调用此类的loadUserByUsername()方法进行身份验证 此类具有UserRepository的自动关联依赖项。现在,这个自动连接的依赖项变成了null。为了解决这个问题,我启用注释驱动配置,并在组件扫描配

我有一个带有注释驱动配置的SpringWebApp

所有控制器、存储库都是自动连接的

在集成Spring Security时,我定义了一个单独的Security-app.xml。我创建了一个名为LoginUserService的服务,它实现了UserDetailsService。现在调用此类的loadUserByUsername()方法进行身份验证

此类具有UserRepository的自动关联依赖项。现在,这个自动连接的依赖项变成了null。为了解决这个问题,我启用注释驱动配置,并在组件扫描配置中添加存储库类的包名

这里也讨论了这个解决方案

但现在的问题是UserRepository有一个EntityManager字段,带有@PersistenceContext注释。对于spring安全配置,它能够找到UserRepository,但无法找到实体管理器。我应该在这里创建一个新的EntityManager工厂吗?我想这将在我的应用程序中创建两个持久性单元

如何向使用原始servlet xml创建的UserRepository注入自动连接依赖项

更新

这里简要讨论了这一点:

但我想一个规范的详细答案会对我更有用

更新

在运行时使用ApplicationContext获取UserRepository如何

if (userRepository == null) {
    userRepository = ApplicationContextProvider.getApplicatonContext().getBean(UserRepository.class);
}

编辑:您在DispatcherServlet配置中声明的bean将不可用于您在contextConfigLocation配置文件中声明的任何bean或组件扫描。因此,在本例中,如果要在为DispatcherServlet加载的配置文件中设置JPA配置,则无法将其连接到安全配置中声明的bean中。您需要将任何类似的“核心”bean配置(数据源配置、db连接池配置、JPA/Hibernate配置、存储库/服务组件扫描等)移动到通过contextConfigLocation加载的配置文件中。然后,您的安全bean和MVC bean都可以使用这些东西。我认为通常的想法是只在DispatcherServlet配置中加载特定于MVC的bean(例如控制器、视图、请求处理程序、请求范围的bean等)。这样可以确保MVC代码和非MVC代码之间有一个清晰的分离,MVC代码与“核心”代码之间只有一个单向依赖关系,而“核心”代码中没有对MVC代码的依赖关系。这有助于使您的代码更加模块化,并且更容易以其他方式重用“核心”代码,特别是在单元测试中


(原始注释文本询问如何加载安全配置,如果它位于contextConfigLocation或其他位置。)

我这里没有app-config.xml。仅在上下文参数中使用security-config.xml。app-config.xml使用DispatcherServlet加载。Spring安全配置是使用contextConfigLocation加载的。通过在两个xml文件中复制配置,可以为EntityManagerFactory获取NoSuchBeanDefinitionException,因为有两个bean而不是一个。考虑到您的回复和其他信息,我已更新了我的答案。我认为你基本上需要重新安排你的配置。DispatcherServlet配置中应该只包含MVC内容,并将非MVC内容(例如JPA配置)移动到通过contextConfigLocation加载的另一个文件中。谢谢,这很有帮助。目前,我是通过在运行时从ApplicationContext加载存储库bean来实现的。我将按照您描述的重构配置。