JFinal异常:The Table mapping of model not exists(4)

发布于 2021-11-29 01:48:07 字数 4495 浏览 914 评论 3

前文1 前文2 前文3

以下是定时器初始化的代码,使用的是ServletContextListener:

public class B2pCheckListener implements ServletContextListener 
{
    Timer timer = new Timer();
    private static final Logger log = Logger.getLogger(B2pCheckListener.class);

    public void contextDestroyed(ServletContextEvent arg0)
    {
        System.out.println("系统定时任务初始化结束....");
        timer.cancel();
    }


    public void contextInitialized(ServletContextEvent arg0)
    {
        System.out.println("系统定时任务初始化开始....");
        /*调用任务,延迟30秒,每15分钟执行一次*/
        long delay = 30 * 1000;
        long intevalPeriod = 900 * 1000;
        timer.scheduleAtFixedRate(new B2pMsgCheck(), delay, intevalPeriod);
   
        Class c = getClass();  
        ClassLoader loader = c.getClassLoader();  
    }
}

以下是定时任务的代码:

public class B2pMsgCheck extends TimerTask
{
        private static final Logger log = Logger.getLogger(B2pMsgCheck.class);
	
	@Override
	public void run()
	{	
               ………………
        }
}

@JFinal 请查看。

问题补充:我把定时任务去掉后,查看启动日志如下:

项目A:

Config的ClassLoader是sun.misc.Launcher$AppClassLoader@5e9e34
Starting JFinal 1.9
Starting scanner at interval of 5 seconds.
Starting web server on port: 80
2015-09-18 15:21:10
[INFO]-[Thread: main]-[org.eclipse.jetty.server.Server.doStart()]: jetty-8.1.8.v20121106
2015-09-18 15:21:10
[INFO]-[Thread: main]-[org.eclipse.jetty.webapp.StandardDescriptorProcessor.visitServlet()]: NO JSP Support for /bocp, did not find org.apache.jasper.servlet.JspServlet
2015-09-18 15:21:11
[INFO]-[Thread: main]-[org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized()]: started o.e.j.w.WebAppContext{/bocp,file:/D:/Eclipse/workspace_j2ee/bocp/src/webapp/}
configPlugin的ClassLoader是WebAppClassLoader=15964901@f39ae5
2015-09-18 15:21:11
[INFO]-[Thread: main]-[com.mchange.v2.log.MLog.<clinit>()]: MLog clients using log4j logging.
2015-09-18 15:21:11
[INFO]-[Thread: main]-[com.mchange.v2.c3p0.C3P0Registry.banner()]: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
2015-09-18 15:21:12
[INFO]-[Thread: main]-[org.eclipse.jetty.server.AbstractConnector.doStart()]: Started SelectChannelConnector@0.0.0.0:80
Starting Complete. Welcome To The JFinal World :)
2015-09-18 15:21:14
Change的ClassLoader是WebAppClassLoader=15964901@f39ae5

问题项目:

BocpTestConfig.class的ClassLoader是sun.misc.Launcher$AppClassLoader@10014f0
Starting JFinal 1.9
Starting scanner at interval of 5 seconds.
Starting web server on port: 80
2015-09-18 15:24:12
[INFO]-[Thread: main]-[org.eclipse.jetty.server.Server.doStart()]: jetty-8.1.8.v20121106
2015-09-18 15:24:12
[INFO]-[Thread: main]-[org.eclipse.jetty.webapp.StandardDescriptorProcessor.visitServlet()]: NO JSP Support for /bocpTest, did not find org.apache.jasper.servlet.JspServlet
2015-09-18 15:24:12
[INFO]-[Thread: main]-[org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized()]: started o.e.j.w.WebAppContext{/bocpTest,file:/D:/Eclipse/workspace_j2ee/bocpTest/webapp/}
configPlugin的ClassLoader是sun.misc.Launcher$AppClassLoader@10014f0
2015-09-18 15:24:13
[INFO]-[Thread: main]-[com.mchange.v2.log.MLog.<clinit>()]: MLog clients using log4j logging.
2015-09-18 15:24:13
[INFO]-[Thread: main]-[com.mchange.v2.c3p0.C3P0Registry.banner()]: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
2015-09-18 15:24:14
[INFO]-[Thread: main]-[org.eclipse.jetty.server.AbstractConnector.doStart()]: Started SelectChannelConnector@0.0.0.0:80
Starting Complete. Welcome To The JFinal World :)
2015-09-18 15:24:19
Change的ClassLoader是sun.misc.Launcher$AppClassLoader@10014f0

问题项目之所以定时任务无法正常获取Model对象,是因为它一直都是从WebAppClassLoader中寻找,但是JFinal的相关对象都在AppClassLoader,因此会报错,但是对于JFinal自身相关的运作是没有影响的,因为是在同一个ClassLoader。而另一个正常运行的项目,它的定时任务和JFinal相关对象都在WebAppClassLoader,所以都运行正常。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

流心雨 2021-11-30 10:14:19

用这个方法是可以解决问题,避免了ClassLoader不一致的问题。不过最后我找到了问题的根源,就是JFinal-1.9的jar包放在maven下,而没有直接放在WEB-INF/lib下,所以导致了WebAppClassLoader找不到相应的类,而在AppClassLoader中加载了。

一笔一画续写前缘 2021-11-30 05:45:14

回复
本质上就是同一个 class 被两个不同的 classload 各自加载了一次,在使用时造成了混乱

飘过的浮云 2021-11-29 21:06:16

    已经在上两个贴子中给出了解决方法:

1:http://www.oschina.net/question/1793377_2132461

2:http://www.oschina.net/question/1793377_251436

    注意这句话:我现在断定你的那个定时线程起动的时机过早,将这个启动放在 YourJFinalConfig.afterJFinalStart() 即可解决问题。

   如果还是不知道如何解决,请看下面的载图:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文