Spring 4中的差异应用程序上下文

佩德罗·冈萨雷斯(Pedro Gonzalez)

我的应用程序中有一个实现UserDetailsS​​ervice的登录服务:

@Service
@Transactional
public class LoginService implements UserDetailsService {

 @Autowired
 UserService userService;

  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    Assert.notNull(username);

    UserDetails result = userService.loadUserDetailsByUsername(username);
    Assert.notNull(result);

    // WARNING: The following sentences prevent lazy initialisation problems!
    Assert.notNull(result.getAuthorities());
    result.getAuthorities().size();

    return result;

  }
}

该应用程序死于上下文初始化期间遇到的错误Exception跟踪的开始是:

Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property 'sourceList' with key [0] ...

结束是:

Cannot resolve reference to bean 'loginService' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'loginService' is defined

因此无法找到loginService

我的web.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

<display-name>SimpleSpringProject</display-name>
<description>All you need!</description>

<!-- Loads Spring Security config file -->
<!--
    contextConfigLocation is the context parameter where we provide the spring security beans configuration file name.
    It is used by ContextLoaderListener to configure authentication in our application
-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/spring-*.xml</param-value>     
</context-param>



<!-- Spring Security -->
<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>


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



<!-- Handles Spring 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/webmvc.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>

在contextConfigLocation中,我正在加载3个文件:spring-security.xmlspring-datasource.xmlspring-jpa.xml

spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security.xsd">

  <security:http auto-config="true" use-expressions="true">

    <security:intercept-url pattern="/user/**" access="hasRole('ROLE_ADMIN')" />
    <security:intercept-url pattern="/role/**" access="hasRole('ROLE_ADMIN')" />

    <security:form-login 
        login-processing-url="/login"
        login-page="/loginForm" 
        default-target-url="/" 
        authentication-failure-url="/loginForm?error" 
        username-parameter="username"
        password-parameter="password" />

    <security:logout logout-url="/logout" logout-success-url="/" delete-cookies="JSESSIONID" />
    <security:csrf />

  </security:http>

  <security:authentication-manager>
    <security:authentication-provider user-service-ref="loginService"></security:authentication-provider>
  </security:authentication-manager>
</beans>

spring-jpa.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/jpa
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

  <jpa:repositories base-package="com.ssp" />

</beans>

spring-datasource.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

<!-- Enable @Transactional annotation -->
<tx:annotation-driven transaction-manager="transactionManager"/>

<!-- MySQL Datasource with Commons DBCP connection pooling -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/simplesp" />
    <property name="username" value="root" />
    <property name="password" value="betis000" />
    <property name="testOnBorrow" value="true"/>
    <property name="testOnReturn" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="1800000"/>
    <property name="numTestsPerEvictionRun" value="3"/>
    <property name="minEvictableIdleTimeMillis" value="1800000"/>
    <property name="validationQuery" value="SELECT 1"/>
</bean>

<!-- EntityManagerFactory -->
<bean
    id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- Transaction Manager -->
<bean
    id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

</beans>

在DispatcherServlet中,我正在加载webmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

<!-- Enable annotation-based Spring MVC controllers (eg: @Controller annotation) -->
<mvc:annotation-driven />

<!-- Classpath scanning of @Component, @Service, etc annotated class -->
<context:component-scan base-package="com.ssp" />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
    up static resources in the ${webappRoot}/resources directory -->
<mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

<!-- Register "global" interceptor beans to apply to all registered HandlerMappings -->
<mvc:interceptors>
    <!-- Set the language in variable lang -->
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
        p:paramName="lang" />
</mvc:interceptors>

<!-- Resolve view name into jsp file located on /WEB-INF -->
<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>


<!-- Tiles -->
<bean id="tilesViewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.tiles3.TilesView" />
</bean>
<bean id="tilesConfigurer"
    class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/tiles/tiles-definitions.xml</value>
        </list>
    </property>
</bean>



<!-- Resolves localized messages*.properties and application.properties 
    files in the application to allow for internationalization. The messages*.properties 
    files translate messages which are part of the admin interface, the application.properties 
    resource bundle localizes all application specific messages such as entity 
    names and menu items. -->
<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource"
    p:basenames="i18n/messages,i18n/application" />

<!-- Store preferred language configuration in a cookie -->
<bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
    p:cookieName="locale" p:defaultLocale="en" />
</beans>

我以为我对applicationContext有问题,因为如果我删除@Service批注并spring-security.xml中定义bean LoginService

<bean id="loginService" class="com.ssp.service.LoginService" />

然后应用程序启动,当我提交登录名时,其UserService为null,因此LoginService的上下文似乎与Bean的上下文有所不同,其中包括:

<context:component-scan base-package="com.ssp" />

如果有人想查看应用程序的完整代码,请访问https://github.com/pedrogonzalezgutierrez/simplespringproject

佩德罗·冈萨雷斯(Pedro Gonzalez)

经过越来越多的研究,我确信这是应用程序上下文存在的问题。看来我的应用程式有两个不同的内容。其中一个由contextConfigLocation加载,另一个由DispatcherServlet加载

刚刚离开的PARAM值的的DispatcherServlet的清空,并通过加载所有配置的contextConfigLocation

我也将bean定义更新到了3.2版本,除了Spring Security需要4.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring 4中的差异应用程序上下文

来自分类Dev

如何在Spring Framework 4中初始化应用程序上下文

来自分类Dev

Spring递归加载应用程序上下文

来自分类Dev

Spring应用程序上下文为null

来自分类Dev

Spring root应用程序上下文和servlet上下文混淆

来自分类Dev

从Spring安全性上下文访问应用程序上下文

来自分类Dev

重新加载或刷新测试方法中的Spring应用程序上下文?

来自分类Dev

在单元测试中启动和关闭Spring应用程序上下文

来自分类Dev

如何在Spring 2.5中从字符串加载应用程序上下文?

来自分类Dev

Spring应用程序-应用程序上下文IOC

来自分类Dev

无法在 Spring Boot 应用程序中加载应用程序上下文

来自分类Dev

在Spring Boot中运行调度程序会生成Spring Boot应用程序上下文外部的进程

来自分类Dev

Spring应用程序中的根上下文路径

来自分类Dev

如何使一个类了解Spring MVC中的多个应用程序上下文?

来自分类Dev

从应用程序上下文中删除Spring Bean

来自分类Dev

多次导入同一spring应用程序上下文文件

来自分类Dev

以编程方式将Bean添加到Spring应用程序上下文

来自分类Dev

应用程序上下文被加载两次-Spring Boot

来自分类Dev

Spring JUnit Test未加载完整的应用程序上下文

来自分类Dev

Spring MVC在应用程序上下文中刷新数据库bean

来自分类Dev

Spring Boot sperate @Configurations用于多个应用程序上下文

来自分类Dev

Spring应用程序上下文重载不会更新DelegatingFilterProxy注册的Bean

来自分类Dev

Spring MVC在应用程序上下文中刷新数据库Bean

来自分类Dev

Spring ContextConfiguraion无法加载应用程序上下文

来自分类Dev

如何在Spring的应用程序上下文中添加http会话管理标签?

来自分类Dev

在创建 Spring 应用程序上下文之前阅读 application.properties

来自分类Dev

两个spring应用程序都使用特定的jar和应用程序上下文-如何控制从上下文从哪个应用程序中获取bean?

来自分类Dev

如何从测试应用程序上下文中排除 Spring Boot 应用程序 bean?

来自分类Dev

如何使用Grizzly嵌入式服务器在Jersey-Spring中配置现有的应用程序上下文?

Related 相关文章

  1. 1

    Spring 4中的差异应用程序上下文

  2. 2

    如何在Spring Framework 4中初始化应用程序上下文

  3. 3

    Spring递归加载应用程序上下文

  4. 4

    Spring应用程序上下文为null

  5. 5

    Spring root应用程序上下文和servlet上下文混淆

  6. 6

    从Spring安全性上下文访问应用程序上下文

  7. 7

    重新加载或刷新测试方法中的Spring应用程序上下文?

  8. 8

    在单元测试中启动和关闭Spring应用程序上下文

  9. 9

    如何在Spring 2.5中从字符串加载应用程序上下文?

  10. 10

    Spring应用程序-应用程序上下文IOC

  11. 11

    无法在 Spring Boot 应用程序中加载应用程序上下文

  12. 12

    在Spring Boot中运行调度程序会生成Spring Boot应用程序上下文外部的进程

  13. 13

    Spring应用程序中的根上下文路径

  14. 14

    如何使一个类了解Spring MVC中的多个应用程序上下文?

  15. 15

    从应用程序上下文中删除Spring Bean

  16. 16

    多次导入同一spring应用程序上下文文件

  17. 17

    以编程方式将Bean添加到Spring应用程序上下文

  18. 18

    应用程序上下文被加载两次-Spring Boot

  19. 19

    Spring JUnit Test未加载完整的应用程序上下文

  20. 20

    Spring MVC在应用程序上下文中刷新数据库bean

  21. 21

    Spring Boot sperate @Configurations用于多个应用程序上下文

  22. 22

    Spring应用程序上下文重载不会更新DelegatingFilterProxy注册的Bean

  23. 23

    Spring MVC在应用程序上下文中刷新数据库Bean

  24. 24

    Spring ContextConfiguraion无法加载应用程序上下文

  25. 25

    如何在Spring的应用程序上下文中添加http会话管理标签?

  26. 26

    在创建 Spring 应用程序上下文之前阅读 application.properties

  27. 27

    两个spring应用程序都使用特定的jar和应用程序上下文-如何控制从上下文从哪个应用程序中获取bean?

  28. 28

    如何从测试应用程序上下文中排除 Spring Boot 应用程序 bean?

  29. 29

    如何使用Grizzly嵌入式服务器在Jersey-Spring中配置现有的应用程序上下文?

热门标签

归档