victorlzw 2021-11-30 15:35 采纳率: 50%
浏览 25
已结题

tomcat反射生成bean报错,本地测试可以正确执行

新手最近在学习一个手写mvc框架的学习过程中,在通过全限定名反射生成实例的时候,出现了ClassNotFoundException,但是在本地测试的时候用同样的方法却没有报错,麻烦大佬看一下是什么原因造成的?谢谢!
以下是DispatcherServlet初始化的代码,className可以正确打印

public void init() throws ServletException {
        //bean标签中的class属性所指向的类加载出来,并将对象也创建出来(通过反射)
        //1.加载读取smart_mvc.xml
        InputStream is = getClass().getClassLoader().getResourceAsStream("smart_mvc.xml");
        //2.加载其中的数据(树状的结果),借助dom4j相关类和接口
        SAXReader saxReader = new SAXReader();
        try {
            //返回的是一个document对象,是一个树状的结构
            Document document = saxReader.read(is);
            //获取xml文件的根路径
            Element root = document.getRootElement();
            //获取根节点中的所有子节点
            List<Element> elements = root.elements();
            List<Object> beans = new ArrayList<>();
            //读取元素的目的是将class属性所指向的路径对应的类加载成对象
            for (Element element : elements) {
                //获取这个元素对象的属性,Element相当于一个bean标签
                String className = element.attributeValue("class");
                System.out.println("className=" + className);

                //根据这个类的路径创建这个类的对象
                Object bean = Class.forName(className).getDeclaredConstructor().newInstance();
                System.out.println("bean: " + bean);
                beans.add(bean);
            }
            System.out.println("after==>" + beans);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

img

报错内容:
java.lang.ClassNotFoundException: org.example.smart_mvc.controller.HelloController 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1407)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1215)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:340)
    at org.example.smart_mvc.web.servlet.DispatcherServlet.init(DispatcherServlet.java:49)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1164)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1117)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:788)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:128)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:832)

测试代码可以正确执行

@Test
    public void test1() throws Exception {
        String s = "org.example.smart_mvc.controller.HelloController";
        Object o = Class.forName(s).getDeclaredConstructor().newInstance();
        System.out.println(o);
    }

img

  • 写回答

1条回答 默认 最新

  • I'Msohs 2021-11-30 17:11
    关注

    init方法单元测试debug下,看包名读的是否正确,你这也不是mvc啊,最多算一个ioc容器

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月8日
  • 已采纳回答 11月30日
  • 创建了问题 11月30日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀