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-07-04 11:17

@张文 jfinal 4.3 昨天已推送至 maven 中心库,尽快升级,爽得不行

JFinal

2019-07-04 11:18

@happyboy 你这也赶紧升到 4.3, 超爽的

happyboy

2019-07-04 15:51

@JFinal 昨天在群里看到通知了,还没来得及更新。

JFinal

2019-07-04 16:25

@happyboy 动作不够快啊,好多小伙伴瞬间就升完了,改个版本号的事

happyboy

2019-07-04 22:32

@JFinal 话是没错,这不有那个过渡版的4.3还在那支撑着吗,恪尽职守,忠心耿耿,不忍心啊。好吧,其实主要是太忙了,这两天在忙别的项目。

JFinal

2019-07-04 23:57

@happyboy 超爽体验,值得拥有

akak

2019-07-16 15:43

前几天忙这个赶进度,没有再继续尝试,今天升级到4.3问题还在,我删除了@Before(Tx.class),问题消除了,添加了无用的注解造成的。

happyboy

2019-07-16 18:22

@akak 这个注解也不能说无用啊,对于事务的回滚还是有必要的。我的项目里也用这个注解了

JFinal

2019-07-16 22:34

@akak 使用 me.setProxyFactory(new CglibProxyFactory()) 即可,兼容更多场景

小智zaki

2019-10-15 09:27

我更新到4.5,也出现类似问题,报错如下
[ERROR]-[Thread: XNIO-1 task-1]-[com.jfinal.proxy.ProxyCompiler.lambda$outputCompileError$0()]: /IndexService$$EnhancerByJFinal.java:3: 错误: 程序包com.jfinal.aop不存在
import com.jfinal.aop.Invocation;

2019-10-15 09:22:12
[ERROR]-[Thread: XNIO-1 task-1]-[com.jfinal.proxy.ProxyCompiler.lambda$outputCompileError$0()]: /IndexService$$EnhancerByJFinal.java:7: 错误: 找不到符号
Invocation inv = new Invocation(this, 1L,
^

2019-10-15 09:22:12
[ERROR]-[Thread: XNIO-1 task-1]-[com.jfinal.core.ActionHandler.handle()]: com.scbc.controller.IndexController.index() : /
java.lang.RuntimeException: java.lang.ClassNotFoundException: com.scbc.service.IndexService$$EnhancerByJFinal
at com.jfinal.proxy.ProxyClassLoader.loadProxyClass(ProxyClassLoader.java:51)
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.AopFactory.createObject(AopFactory.java:173)
at com.jfinal.aop.AopFactory.doGetSingleton(AopFactory.java:87)
at com.jfinal.aop.AopFactory.doGet(AopFactory.java:65)
at com.jfinal.aop.AopFactory.doInject(AopFactory.java:157)
at com.jfinal.aop.AopFactory.inject(AopFactory.java:125)
at com.jfinal.aop.Aop.inject(Aop.java:105)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:77)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:89)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:119)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:364)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.ClassNotFoundException: com.scbc.service.IndexService$$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)

JFinal

2019-10-15 09:33

@小智zaki 根据文档解决一下
https://www.jfinal.com/doc/4-8

小智zaki

2019-10-15 10:59

@JFinal 呀!!完美结果,谢波总,波总V5

dzofmine

2019-11-02 14:50

@JFinal 我也遇到了这种情况,用的4.7 不过我容器使用的resin

JFinal

2019-11-02 15:29

@dzofmine 参考这个文档:
https://www.jfinal.com/doc/4-8

配置一下:
me.setToCglibProxyFactory();

dzofmine

2019-11-02 16:38

@JFinal 切换到Cglib没问题。是我jdk的环境问题吗?还是resin的问题呢

JFinal

2019-11-02 17:38

@dzofmine 如果是 JDK 并且环境变量配置正确,那么就可以确定是 resin 的问题

jfinal 更早期的版本在 tomcat 下也有这个问题,原因是 tomcat 启动时无法正确加载 CLASSPATH 环境变量,jfinal 新版本解决了这个问题

使用 me.setToCglibProxyFactory() 就挺好的,多一个 jar 包,但功能是完全没问题的

dzofmine

2019-11-02 18:39

@JFinal 好的! 感谢!

chcode

2019-12-01 20:34

@JFinal 我用undertow 在4.7 今天也遇到这个问题了 回退到4.2 正常了...

chcode

2019-12-01 20:40

@JFinal ProxyManager.me().setProxyFactory(new CglibProxyFactory()); 设置这个就没报错了...

chcode

2019-12-02 11:40

@JFinal 经过一番调试报错原因找到了,ProxyCompiler.java 里面的getClassPath()方法 获取的windows系统路径中如果带有空格 获取到classpath会变成D:/Program%20Files/java/maven-3.6.1/.m2/repository/com/jfinal/jfinal/4.7/jfinal-4.7.jar D:\Program Files文件夹中间有一个空格 这样会造成classpath错误 自然报错 程序包com.jfinal.aop不存在 我把maven 的本地仓库地址 移动到一个没有空格的文件夹 问题得到了解决,所以我想 获取classpath 这块逻辑可以想办法处理下文件夹带有空格的classpath路径

JFinal

2019-12-06 23:01

@chcode 空格问题头一回碰到,期待你后续的分享

chcode

2019-12-11 16:14

@JFinal 4.2 没有问题是因为4.2 没有getClassPath() 这个方法,这个方法是4.2 之后处理tomcat classpath丢失问题而出现的

JFinal

2019-12-11 16:16

@chcode 配置一下 me.setToCglibProxyFactory() 完美解决

chcode

2019-12-11 20:23

@JFinal 这个我知道啊,关键有默认实现 优先使用自带的,回头有空研究下 这个问题再来反馈

JFinal

2019-12-11 21:33

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

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

热门反馈

扫码入社