【问题标题】:Cannot find class [food.bill.dao.FoodDaoImpl] for bean with name 'foodDAO' defined in ServletContext resource [/WEB-INF/applicationContext.xml];找不到在 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义的名称为“foodDAO”的 bean 的类 [food.bill.dao.FoodDaoImpl];
【发布时间】:2018-09-10 08:43:01
【问题描述】:

我正在学习 Spring,但遇到了一个错误。 Spring 无法在 bean 中找到定义的类:

31-Mar-2018 20:12:44.049 SEVERE [RMI TCP Connection(3)-127.0.0.1] 
org.springframework.web.context.ContextLoader.initWebApplicationContext 
Context initialization failed
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [food.bill.dao.FoodDaoImpl] for bean with name 'foodDAO' defined in ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.lang.ClassNotFoundException: food.bill.dao.FoodDaoImpl
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1385)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:609)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1484)
at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1007)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:741)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4753)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5215)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: food.bill.dao.FoodDaoImpl
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1291)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)
at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:401)
at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1432)
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1377)
... 55 more

这是我的 applicationContext.xml:

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

    <bean id="foodDAO" class="food.bill.dao.FoodDaoImpl"/>

    <bean id="foodService" class="food.bill.service.FoodServiceImpl">
        <property name="foodDao" ref="foodDAO"/>
    </bean>

</beans>

FoodDaoImpl:

package food.bill.dao;

import food.bill.model.FoodItem;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;


public class FoodDaoImpl implements FoodDao {

    private static final Logger log = LogManager.getLogger(FoodDaoImpl.class);
    @PersistenceContext
    EntityManager em;

    public List<FoodItem> getMenu() {
        List<FoodItem> foodMenu = null;
        try {
            Query query = em.createNamedQuery("FoodItem.getMenu");
                 foodMenu = (List<FoodItem>) query.getResultList();
            return foodMenu;
        }catch (Exception e){
            log.info("Error in getting Menu");
        }
        return foodMenu;
    }


    public void createOrder() {

    }
}

FoodServiceImpl:

package food.bill.service;

import food.bill.dao.FoodDao;
import food.bill.model.FoodItem;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class FoodServiceImpl implements FoodService {

   private FoodDao foodDao;

    public void setFoodDao(FoodDao foodDao) {
        this.foodDao = foodDao;
    }

    public List<FoodItem> getMenu() {
        return this.foodDao.getMenu();
    }
}

我检查了输出文件夹并且所有文件都已更新。尝试搜索几个小时,但没有得到任何结果。任何帮助,将不胜感激。提前致谢。

【问题讨论】:

  • 添加FoodServiceImpl的源码
  • @lucumt 代码已更新

标签: java spring hibernate spring-mvc jpa


【解决方案1】:

org.springframework.beans.factory.CannotLoadBeanClassException: 不能 查找名称为“foodDAO”的 bean 的类 [food.bill.dao.FoodDaoImpl] 在 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义; 嵌套异常是 java.lang.ClassNotFoundException: food.bill.dao.FoodDaoImpl

仅表示 Spring 正在尝试查找您定义的类路径中 food.bill.dao.FoodDaoImpl 类的 .class 文件,但没有找到。

所以请先检查food.bill.dao.FoodDaoImpl文件是否真的被编译为.class文件,以及它在你的输出文件目录中的位置。

【讨论】:

  • 我已经检查了多次,它存在于输出文件夹中。
  • 请问您使用的是哪个 IDE(eclipse、netbeans、IntelliJ)?
  • 我正在使用 IntelliJ Idea
【解决方案2】:

需要仔细检查的几件事

  1. 如果您使用 Maven 或任何其他构建工具,请尝试“Maven clean”并检查它是否删除了 foodDao.class 文件。如果确实如此,那么在清理之后进行 Maven 构建,看看它是否解决了问题。

  2. 如果步骤 1 没有解决问题,请尝试将 foodDAO 的 bean 定义放在 context.xml 中 foodService 的 bean 定义之后(只是一个想法)

如果问题仍然存在,请告诉我。

【讨论】:

    【解决方案3】:

    这似乎是一个Maven 中的错误。我也多次面对这个问题。即使类存在但未根据错误检测到,执行以下操作对我有用。

    解决方案一:从源包中删除 Java 文件类。

    1. 创建代码备份并从源包中删除Java文件。
    2. 通过创建具有相同内容的新文件将文件添加回源包 您遇到错误的 Java 类代码。

    解决方案二:将 Java 文件类从一个源包移动到另一个源包。

    1. 将 Java 文件类从一个源包移动到另一个源包。
    2. 然后将 Java 文件类放回原来的包中。

    我希望任何一个解决方案都会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2014-04-16
      • 2018-02-14
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多