【问题标题】:Cannot find Class XXX for bean with the name XXX defined in ServletContext找不到在 ServletContext 中定义的名称为 XXX 的 bean 的类 XXX
【发布时间】:2018-12-17 04:50:00
【问题描述】:

我正在编写 Spring MVC 并遇到以下错误:

18:34:44,999 警告 [org.springframework.web.context.support.XmlWebApplicationContext] (MSC 服务线程 1-1)上下文期间遇到异常 初始化 - 取消刷新尝试: org.springframework.beans.factory.BeanCreationException:错误 用名字创建bean 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': bean初始化失败;嵌套异常是 org.springframework.beans.factory.CannotLoadBeanClassException:不能 为具有名称的 bean 查找类 [com.icumed.beans.RequestInterfaceImpl] ServletContext 资源中定义的“scopedTarget.requestscope” [/WEB-INF/FetchDevice-servlet.xml];嵌套异常是 java.lang.ClassNotFoundException: [Module 中的 com.icumed.beans.RequestInterfaceImpl 来自服务模块的“deployment.6.BeanScopingRequestSession.war:main” Loader]相关原因: org.springframework.beans.factory.CannotLoadBeanClassException:不能 为具有名称的 bean 查找类 [com.icumed.beans.RequestInterfaceImpl] ServletContext 资源中定义的“scopedTarget.requestscope” [/WEB-INF/FetchDevice-servlet.xml];嵌套异常是 java.lang.ClassNotFoundException: [Module 中的 com.icumed.beans.RequestInterfaceImpl 来自服务模块的“deployment.6.BeanScopingRequestSession.war:main” Loader]相关原因: org.springframework.beans.factory.CannotLoadBeanClassException:不能 为具有名称的 bean 查找类 [com.icumed.beans.SessionInterfaceImpl] ServletContext 资源中定义的“scopedTarget.sessionscope” [/WEB-INF/FetchDevice-servlet.xml];嵌套异常是 java.lang.ClassNotFoundException: [模块中的 com.icumed.beans.SessionInterfaceImpl 来自服务模块的“deployment.6.BeanScopingRequestSession.war:main” 装载机]

我的目录结构:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                            http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="WebApp_ID" version="2.5">
  <display-name>ICUMED-Req-Session-scope</display-name>
  <servlet>
    <servlet-name>FetchDevice</servlet-name>
    <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>FetchDevice</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
  </listener>
</web-app>

FetchDevice-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
 <mvc:annotation-driven />

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

<context:component-scan base-package="com.icumed.beans" />
<context:annotation-config />

<bean id="requestscope" class="com.icumed.beans.RequestInterfaceImpl" scope="request">
  <constructor-arg value="Device1"/>
   <aop:scoped-proxy proxy-target-class="false" />
</bean>

<bean id="sessionscope" class="com.icumed.beans.SessionInterfaceImpl" scope="session">
  <constructor-arg value="Device2"/>
   <aop:scoped-proxy proxy-target-class="false" />
</bean>
</beans>

TestController.java

package com.icumed.beans;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

    @Autowired(required=true)
    private RequestInterfaceImpl requestInterfaceImpl;

    @Autowired(required=true)
    private SessionInterfaceImpl sessionInterfaceImpl;

    @RequestMapping(value = "/")
    public String fetchDevice(Model model) {
        model.addAttribute("requestscopedData", requestInterfaceImpl.getDeviceName());
        model.addAttribute("sessionscopedData", sessionInterfaceImpl.getDeviceName());

        /* return to view "hello.jsp" */
        return "device";
    }

}

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    首先: 你可以改变你的过滤器。有时它需要这些。

    <filter>
    <filter-name>requestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filterclass>
    </filter>
    <filter-mapping>
    <filter-name>requestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>      //filter path
    </filter-mapping>
    

    第二: 你知道RequestInterfaceImpl@Autowired。它需要代理; 你设置了proxy-target-class="false",所以它将使用JDK代理,而不是CGLib。

    你可以这样做:

    @Autowired(required=true)
    private RequestInterface requestInterface;   // use its interface, not impl
    

    或者你可以设置proxy-target-class="true"。我认为是代理错误!

    【讨论】:

    • :这有帮助。就像你提到的已经设置了 proxy-target-class="true"。同样在 TestController 中自动装配时,我使用限定符指向适当的 beanId
    猜你喜欢
    • 2018-06-28
    • 2018-09-10
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多