jfinal4.2报错com.jfinal.aop does not exist

之前一直用的jfinal老版本3.5,一直很稳定,看到4.2发布了,于是决定与时俱进升级一下。但是,问题来了,启动很正常,但是涉及到service调用的基本都报错。注:4.2在本机windows下调试的时候也正常,但是部署到linux服务器上之后出问题了。

Caused by: 
java.lang.ClassNotFoundException: com.work.web.system.daolian.DaoLianService$$EnhancerByJFinal
	at java.lang.ClassLoader.findClass(ClassLoader.java:530)
	at com.jfinal.proxy.ProxyClassLoader.findClass(ProxyClassLoader.java:64)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at com.jfinal.proxy.ProxyClassLoader.loadProxyClass(ProxyClassLoader.java:49)
	at com.jfinal.proxy.ProxyFactory.getProxyClass(ProxyFactory.java:70)
	at com.jfinal.proxy.ProxyFactory.get(ProxyFactory.java:41)
	at com.jfinal.proxy.Proxy.get(Proxy.java:32)
	at com.jfinal.aop.Duang.duang(Duang.java:42)
	at com.work.web.system.daolian.DaoLianService.<clinit>(DaoLianService.java:16)
	at com.work.web.system.daolian.DaoLianController.<init>(DaoLianController.java:20)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at com.jfinal.core.ControllerFactory.getController(ControllerFactory.java:25)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:76)
	at com.core.handler.XssHandler.handle(XssHandler.java:31)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:89)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
	at com.core.filter.LoginFilter.chainAdmin(LoginFilter.java:115)
	at com.core.filter.LoginFilter.doFilter(LoginFilter.java:48)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
	at com.core.filter.WebFilter.doFilter(WebFilter.java:86)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
	at com.core.filter.DomainFilter.doFilter(DomainFilter.java:50)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1588)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1557)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:502)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:411)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:305)
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:159)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:748)
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:3: error: package com.jfinal.aop does not exist
import com.jfinal.aop.Invocation;
                     ^
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:4: error: cannot find symbol
public class SessionService$$EnhancerByJFinal extends SessionService {
                                                      ^
  symbol: class SessionService
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:6: error: package com.core.tools does not exist
	public  void del(com.core.tools.PageData p0) throws java.lang.Exception {
	                               ^
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:7: error: cannot find symbol
		Invocation inv = new Invocation(this, 13L,
		^
  symbol:   class Invocation
  location: class com.work.web.system.session.SessionService$$EnhancerByJFinal
Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:7: error: cannot find symbol
		Invocation inv = new Invocation(this, 13L,
		                     ^
  symbol:   class Invocation
  location: class com.work.web.system.session.SessionService$$EnhancerByJFinal

总结一下,以上核心的报错如下:

Caused by: 
java.lang.ClassNotFoundException: com.work.web.system.daolian.DaoLianService$$EnhancerByJFinal

Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:3: error: package com.jfinal.aop does not exist

Jun 07, 2019 8:34:23 PM com.jfinal.proxy.ProxyCompiler error
SEVERE: /SessionService$$EnhancerByJFinal.java:7: error: cannot find symbol
		Invocation inv = new Invocation(this, 13L,

在社区看到一篇帖子,跟我的情况很像,但是帖子并没有给出解决方案。http://www.jfinal.com/feedback/5931

目前我还在排查原因,尚未解决。已经暂时降到3.5版本了,降级后一切恢复正常。

------------------------------------

后续补充:

1.如果是web项目,jfinal最新版本已经解决上述问题

2.如果是非web项目,手动指定cglib为代理库可解决问题:ProxyManager.me().setProxyFactory(new CglibProxyFactory());    更多请参考在线文档:https://jfinal.com/doc/4-8

评论区

JFinal

2019-12-11 21:35

@chcode jfinal 4.0 版本之前一直是 cglib 实现的 Aop 代理,所以 setToCglibProxyFactory() 经历的应用场景更多,适应力更强

例如,你碰到的这种路径有空格的问题,这种情形在开发时很难想到,只能等到某位同学碰到,并且还要这位同学有追跟问底的精神,才能定位问题,才有可能在新版本中解决

所以,做一个被广泛使用的 web 框架其实是极难的,因为场景千变万化,需要长时间的打磨与积累才能成熟

jfinal 经因了 8 年多的迭代,现在已经十分成熟完善,如果 8 年前我知道要花这么多时间迭代,jfinal 应该是不会存在的

happyboy

2019-12-12 13:35

@chcode @JFinal 其实对于空格的问题,我们在项目中一向都会额外处理,获取根路径后,马上处理20%,很早之前我们就进过这个坑,但是这个问题比较好排查,^_^

gulx

2020-01-14 11:06

@JFinal 波总,您好:
这个问题在我的项目里也重新了,但根据排查,出现情况是跟代码的写法有一定关系,不单纯是环境原因。
总结如下:
使用新版本JFinal 4.8,当使用了Aop方法后(Enhancer.enhance也会出现同样问题):
public static final Org daox = Aop.get(Org.class);
同时在另一个方法上使用了Aop注解(Before)
@Before(Tx.class)
public void saveTx(Org org){
//any content
}
则无论是否使用JDK,无论是否正确配置Classpath,一定会出现:
2020/01/13 22:36:53 XNIO-1 task-1ERROR|com.jfinal.proxy.ProxyCompiler:80 - /Org$$EnhancerByJFinal.java:3: error: package com.jfinal.aop does not exist
import com.jfinal.aop.Invocation;

只要去掉@Before(Tx.class),或配置
ProxyManager.me().setProxyFactory(new CglibProxyFactory());
则不会出任何问题。

gulx

2020-01-14 11:13

@gulx 补充:上述问题确实在开发环境(IDE/Idea)启动时无论如何都不会出现,而一旦部署模式启动:Windows with Jar,Linux with OpenJDK等,则一定重现。

JFinal

2020-01-14 12:43

@gulx 添加一个配置:
me.setToCglibProxyFactory();

注意看文档:
https://jfinal.com/doc/4-8

主要原因有两个:
1:部署环境中的 CLASSPATH 在运行时刻不对,例如少数 tomcat 版本部署就有这个问题

2:JRE 环境

happyboy

2020-01-15 13:59

@gulx @JFinal 这么巧,今天我在非web环境下使用jfinal4.8,部署后也遇到了这个问题。我在bat脚本里手动指定了JAVA_HOME和PATH,都是指向jdk的。确实如楼上所有,在Eclipse里调试的时候没有问题,但是脱离开发工具部署后,就报错了。然后手动指定cglib为代理库:ProxyManager.me().setProxyFactory(new CglibProxyFactory());搞定。非web环境下不能直接使用jfinal自身的代理模块吗?

热门反馈

扫码入社