【问题标题】:Referenced Bean not found未找到引用的 Bean
【发布时间】:2015-04-25 04:59:29
【问题描述】:

我是 Spring 新手,正在使用 Spring 3.2.5 RELEASE。我有一个名为 MongoUserDetailsS​​ervice 的自定义 UserDetailsS​​evice。这是我的 application-security.xml。

<http auto-config="true">
  <intercept-url pattern="/secured/*" access="ROLE_USER" />
    <form-login login-processing-url="/login" login-page="/loginPage"
        username-parameter="username" password-parameter="password"
        default-target-url="/secured/mypage" authentication-failure-url="/loginPage?auth=fail" />
    <logout logout-url="/logout" logout-success-url="/logoutPage" />        
</http>

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="mongoUserDetailsService">
        <password-encoder hash="plaintext" />
    </authentication-provider>
</authentication-manager>

这是我的 dispatcher-servlet.xml

<context:component-scan base-package="com.srccodes.spring.controller" />

<mvc:annotation-driven />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean id="mongoUserDetailsService" class="com.srccodes.spring.security.MongoUserDetailsService">
</bean>

我在提供身份验证提供程序的 application-security.xml 中收到 bean not found 错误。我检查了路径,它们是正确的。

我也在添加我的 web.xml。

    <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<!-- Spring context files to be loaded -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/applicationContext.xml,
        /WEB-INF/application-security.xml,
        /WEB-INF/mongo-config.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<!-- filter declaration for 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>

【问题讨论】:

    标签: java xml spring spring-mvc


    【解决方案1】:

    在 application-security.xml 文件中必须导入 dispatcher-servlet.xml 以下代码显示导入 sysntax: 1- 如果 dispatcher-servlet.xml 是 buildPath:

    <import resource="classpath:DIR/dispatcher-servlet.xml" />
    

    2-如果是WEB-INF DIR

    <import resource="DIR/dispatcher-servlet.xml" />
    

    希望能帮到你

    【讨论】:

    • 显示错误提示在 dispatcher-servlet.xml 中不允许导入
    【解决方案2】:

    如果您已将您的 application-security.xml 定义为根上下文(即,它是通过 ... ContextLoaderListener 加载的)和您的 dispatcher-servlet.xml 通过 DispatcherServlet,您将遇到可见性/范围问题。 DispatcherServlet 上下文是根上下文的子上下文,因此在 DispatcherServlet 上下文中定义的 bean 对根上下文不可见,但根上下文 bean 对所有子 servlet 上下文可见。

    因此,将您的 mongoUserDetailsService 移至您的 application-security.xml

    更新:

    您正在加载您的 dispatcher-servlet.xml 配置两次,一次是在

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/dispatcher-servlet.xml
            /WEB-INF/application-security.xml
            /WEB-INF/mongo-config.xml
        </param-value>
    </context-param>
    

    再一次隐式地(按照 Spring 约定)使用 DispatcherServlet。您应该查看 Spring reference 以更好地了解 ApplicationContext 和 DispatcherServlet

    1. 您需要从 contextConfigLocations 中删除 dispatcher-servlet.xml
    2. 您的 dispatcher-servlet.xml 应该只包含 Spring MVC 相关的配置。除非这是您的意图,否则以下组件扫描过于包容,您应该将其限制为与 spring mvc 相关(例如控制器),将安全性、存储库等内容移至根上下文。
    <context:component-scan base-package="com.srccodes.spring" /> 
    <context:component-scan base-package="com.srccodes.spring.security" />
    <context:component-scan base-package="com.srccodes.spring.domain" />
    <context:component-scan base-package="com.srccodes.spring.repositories" />
    <context:component-scan base-package="com.srccodes.spring.controller" />
    
    1. 将您的 mongoUserDetailsS​​ervice 移动到 application-security.xml

    【讨论】:

    • 抱歉回复晚了……迫切需要。如何将服务移动到我的 application-security.xml?请查看我添加的 web.xml。
    • 1.我删除了 dispatcher-servlet.xml。然后我将安全和存储库移至 applicationContext.xml。 (新文件)。我坚持将 mongoUserDetailsS​​ervice 移动到 application-security.xml。我试过 ...但弹出一个错误。这是唯一坚持的部分。你能举个例子吗?
    猜你喜欢
    • 2015-05-11
    • 2015-04-05
    • 1970-01-01
    • 2013-04-18
    • 2021-02-19
    • 2021-08-04
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多