0

我正在使用 Spring MVC 3.0.6 和 Spring security 3.0.7。在安全上下文中,我无法将 RoleDao 类 @Autowire 到我的用户类。

我的 web.xml 文件:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/root-context.xml
        /WEB-INF/security-app-context.xml
    </param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Processes application requests -->
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>



<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

安全应用上下文.xml:

<beans:bean id="chineseCheckersEntryPoint" class="com.nike.golf.security.ChineseCheckersAuthenticationEntryPoint" />

<beans:bean id="chineseCheckersFilter" class="com.nike.golf.security.ChineseCheckersAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager"/>
</beans:bean>

<http use-expressions="true" auto-config="false" entry-point-ref="chineseCheckersEntryPoint">
    <intercept-url pattern="/secure/extreme/**" access="hasRole('supervisor')" />
    <intercept-url pattern="/user/**" access="permitAll" />
    <intercept-url pattern="/profile/**" access="isAuthenticated()" />
    <intercept-url pattern="/secure/**" access="isAuthenticated()" />
    <custom-filter position="PRE_AUTH_FILTER" ref="chineseCheckersFilter" />
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="chineseCheckersAuthenticationProvider" />
</authentication-manager>

<beans:bean id="chineseCheckersAuthenticationProvider" class="com.nike.golf.security.ChineseCheckersAuthenticationProvider" />

在我使用 roleDao 的用户对象中,它为空。它没有被自动接线。从我在网上所做的所有研究来看,它似乎与不同的上下文有关,并且无法在它们之间自动连接。

有人可以帮助我理解这些背景以及如何让它们进入相同的背景吗?

4

2 回答 2

1

感谢大家的帮助。我设法弄清楚了这一点。

这个问题与我的相似,让我朝着正确的方向前进: Declaring Spring Bean in Parent Context vs Child Context

这个论坛帖子真的为我简化了这个想法。

在 web.xml 文件中定义 servlet 上下文和应用程序上下文。应用程序上下文通过这些 XML 片段进行配置:

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/root-context.xml
        /WEB-INF/security-app-context.xml
    </param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

您传递给 context-param > contextConfigLocation 的任意数量的 *context.xml 文件都在应用程序上下文中。这是父上下文。

servlet 上下文是通过以下 xml 在 web.xml 文件中创建的:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

作为子上下文的 servlet 上下文可以访问应用程序上下文(父级)。

这是我理解的关键。因此,我将 servlet 上下文中的所有配置移至应用程序上下文。

就像我上面链接的另一个问题的答案一样,@Autowired 仍然不起作用。有谁知道这是什么原因?所以为了解决这个问题,我在 xml 中定义了 bean 和属性,从我关心的属性一直到 sessionFactory。

现在的问题是,我可以将 xml 中需要的 bean 一直连接到 sessionFactory,因为它在同一个上下文中,因为我将它从之前的 servlet 上下文移到了应用程序上下文。

在我的问题中,我什至没有发布 servlet-context.xml 文件,因为我认为不需要触及它,但事实上,如果我想将配置连接到应用程序上下文,我需要将配置移到应用程序上下文中我的安全豆。

我希望这是有道理的。

于 2011-11-30T08:54:16.800 回答
0

您可以将上下文想象为一组 Spring bean。

上下文可以嵌套,因此外部上下文可以从内部访问 bean,但反之则不行。这方面的一个示例是典型的 Web 应用程序,它有两个上下文:用 指定contextConfigLocation并由 加载的内部上下文ContextLoaderListener,以及用DispatcherServlet.

将两个 xml 文件合并到一个上下文的一种方法是引入第三个应用程序配置 xml 文件,该文件仅包含其他 xml 文件bean:include。然后您只需为加载程序指定这第三个 xml 文件。但我不确定您是否真的为ContextLoaderListener. -- 无论如何,您可以尝试使用 3.xml 文件的技巧。

于 2011-11-30T06:27:48.757 回答