在DemoConfig 中不支持@Inject 和 Aop.get()...吗

在DemoConfig  extends JFinalConfig 中

  1. 使用  @Inject  注入自己的 Service类 然后在 onStart 中使用会报 空指针错误。

  2. 使用 Aop.get(Service类) 启动的时候会报一系列错误。



  3. 2019-09-28 11:57:06
    [ERROR]-[Thread: main]-[com.jfinal.proxy.ProxyCompiler.lambda$outputCompileError$0()]: /ScheduleService$$EnhancerByJFinal.java:3: 错误: 程序包com.jfinal.aop不存在
    import com.jfinal.aop.Invocation;
                         ^
    
    2019-09-28 11:57:06
    [ERROR]-[Thread: main]-[com.jfinal.proxy.ProxyCompiler.lambda$outputCompileError$0()]: /ScheduleService$$EnhancerByJFinal.java:6: 错误: 程序包com.jfinal.kit不存在
    	public  com.jfinal.kit.Ret saveAll(java.lang.String p0, java.lang.String p1, java.util.Map<java.lang.String, java.lang.Object> p2) {
    	                      ^
    
    2019-09-28 11:57:06
    [ERROR]-[Thread: main]-[com.jfinal.proxy.ProxyCompiler.lambda$outputCompileError$0()]: /ScheduleService$$EnhancerByJFinal.java:7: 错误: 找不到符号
    		Invocation inv = new Invocation(this, 1L,
    		^
      符号:   类 Invocation
      位置: 类 com.liyesoft.jadmin.system.module.schedule.ScheduleService$$EnhancerByJFinal
    
    2019-09-28 11:57:06
    [ERROR]-[Thread: main]-[com.jfinal.proxy.ProxyCompiler.lambda$outputCompileError$0()]: /ScheduleService$$EnhancerByJFinal.java:7: 错误: 找不到符号
    		Invocation inv = new Invocation(this, 1L,
    		                     ^
      符号:   类 Invocation
      位置: 类 com.liyesoft.jadmin.system.module.schedule.ScheduleService$$EnhancerByJFinal
    java.lang.RuntimeException: java.lang.ClassNotFoundException: com.liyesoft.jadmin.system.module.schedule.ScheduleService$$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.get(AopFactory.java:48)
    	at com.jfinal.aop.Aop.get(Aop.java:101)
    	at com.liyesoft.jadmin.system.JAdminConfig.<init>(JAdminConfig.java:32)
    	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.JFinalFilter.createJFinalConfig(JFinalFilter.java:124)
    	at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:60)
    	at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)
    	at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)
    	at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:591)
    	at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:556)
    	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
    	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    	at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:598)
    	at com.jfinal.server.undertow.UndertowServer.configHttp(UndertowServer.java:284)
    	at com.jfinal.server.undertow.UndertowServer.doStart(UndertowServer.java:262)
    	at com.jfinal.server.undertow.UndertowServer.start(UndertowServer.java:159)
    	at com.jfinal.server.undertow.UndertowServer.start(UndertowServer.java:92)
    	at Run.main(Run.java:33)
    Caused by: java.lang.ClassNotFoundException: com.liyesoft.jadmin.system.module.schedule.ScheduleService$$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)
    	... 28 more

评论区

JFinal

2019-09-28 12:13

按下面步骤解决一下:
1:新建一个启动类,例如:
public class App {
public void main(String[] args) {
UndertowServer.start(DemoConfig.class);
}
}

2: DemoConfig 中声明的属性不能直接支持注入(注入参考后面第三条),Aop.get(...) 只有有限的支持,因为创建 DemoConfig 的时候各种初始化还没进行,可以在 onStart() 方法中使用 Aop.get(...) 进行注入

3:可以在 DemoConfig 中的 onStart() 方法中通过 Aop.inject(this) 对 DemoConfig 中的 @Inject 属性进行注入

Terely

2019-09-28 13:39

@JFinal 几种方式都试过了,还是不行。之前版本使用 Duang.duang(Service类) 来创建的时候是没有问题的,升级4.5 修改成@Inject 之后就不行了。貌似现在4.5改回去Duang.duang 也不行了。

Terely

2019-09-28 13:42

@JFinal 报错内容 和这个帖子http://www.jfinal.com/feedback/5985,很像。但是这个帖子貌似也没解决方案

Terely

2019-09-28 14:03

@JFinal 经过debug跟踪,最终发现是在com.jfinal.prody.ProxyClassLoader 类的

public Class loadProxyClass(ProxyClass proxyClass) {
for (Entry e : proxyClass.getByteCode().entrySet()) {
byteCodeMap.putIfAbsent(e.getKey(), e.getValue());
}

try {
return loadClass(proxyClass.getPkg() + "." + proxyClass.getName());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}

return loadClass(proxyClass.getPkg() + "." + proxyClass.getName()); 这里报错了。

JFinal

2019-09-28 14:17

@Terely 加个配置即可
me.setProxyFactory(new CglibProxyFactory());

Terely

2019-09-28 14:36

@JFinal 是的换成cglib 就可以了,那么在就4.2 版本 干掉这唯一的第三方依赖, cglib的时候,是否还有类似不完善之处。后续是否升级?

JFinal

2019-09-28 15:22

@Terely 4.2 的后续版本针对 proxy 模块有过细微的改进,一个是解决部分环境下 CLASSPATH 变量问题,二个是对生成的代码进行了细微调整

建议升级到 jfinal 4.5

此外,使用新版本的 proxy + aop 模块,并且不依赖 cglib 的话,需要 JDK 支持,不能是 JRE

对于你碰到的情况,估计升级到 jfinal 4.5 即可,记得搞定后回来反馈一下

jfinal 近几个版本升级的功能细节,可以下载首页的 jfinal-4.5-changelog.txt

Terely

2019-09-28 15:27

@JFinal
我现在用的就是4.5;
的确只需要
1.添加上me.setProxyFactory(new CglibProxyFactory());
2.maven引入 cglib的 依赖之后,就没问题了。
但是去掉上述两项就报错,出问题。感觉还是jfinal的 proxy 应该是有问题的,无法完全代替cglib
另外:我在DemoConfig中 @Inject的 service中 还有 @Inject注解的 其他service类属性。

热门反馈

扫码入社