Spring MVC, Spring Security и Hibernate не могут автоматически связывать свойства между контекстами - PullRequest
0 голосов
/ 30 ноября 2011

Я использую Spring MVC 3.0.6 и Spring security 3.0.7. Я не могу @Autowire класса RoleDao для моего пользовательского класса, когда в контексте безопасности.

мой файл 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>

security-app-context.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, он пуст. Он не был подключен автоматически. Из всех исследований, которые я провел в Интернете, похоже, что они связаны с различными контекстами и невозможностью автоматической связи между ними.

Может ли кто-нибудь помочь мне понять эти контексты и как я могу привести их в один и тот же контекст?

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Спасибо всем за помощь.Мне удалось выяснить это.

Этот вопрос был похож на мой и заставил меня двигаться в правильном направлении: Объявление Spring Bean в родительском контексте против дочернего контекста

Это сообщение на форуме действительно упростило для меня эту идею.

В своем файле web.xml вы определяете контекст сервлета и контекст приложения.Контекст приложения настраивается с помощью следующих фрагментов 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.xml, передаваемых в context-param> contextConfigLocation, находится в контексте приложения.Это родительский контекст.

Контекст сервлета создается в файле web.xml с помощью этого бита 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>

Контекст сервлета как дочерний контекст имеет доступ к приложениюcontext (parent).

Это была ключевая вещь для меня, чтобы понять.Поэтому я перенес всю конфигурацию, которую имел в контексте сервлета, в контекст приложения.

Как и ответ на другой вопрос, на который я ссылался выше, говорит, что @Autowired все еще не работает.Кто-нибудь знает причину этого?Поэтому, чтобы обойти это, я определил bean-компоненты и свойства в xml на всем пути от свойства, которым я занимался, до sessionFactory.

Теперь я могу подключить нужные мне bean-компоненты в xmlвплоть до иерархии к sessionFactory, потому что она была в том же контексте, поскольку я переместил ее в контекст приложения из контекста сервлета, где он был раньше.

В моем вопросе я даже не опубликовалфайл servlet-context.xml, потому что я не думал, что к нему нужно прикасаться, но на самом деле мне нужно было перенести конфигурацию в контекст приложения, если я хотел связать вещи с компонентами безопасности.

Я надеюсь, что это имеет смысл.

0 голосов
/ 30 ноября 2011

Вы можете представить контекст как набор bean-компонентов Spring.

Контексты могут быть вложенными, чтобы внешний контекст мог обращаться к bean-компонентам из внутреннего, но не наоборот.Примером этого являются типичные веб-приложения, которые имеют два контекста: внутренний, указанный с помощью contextConfigLocation и загруженный с помощью ContextLoaderListener, и внешний, настроенный с помощью DispatcherServlet.

. Один из способовобъединить два XML-файла в один контекст, вводит третий XML-файл конфигурации приложения, который включает только другие XML-файлы через bean:include.И тогда вам остается только указать эти третьи XML-файлы для загрузчика. Но я не уверен, действительно ли у вас настроено 2 контекста приложения для ContextLoaderListener.- В любом случае вы можете попробовать трюк с 3.xml файлом.

...