Closed uuxii closed 4 years ago
原因是:Dataway 是依托 Hasor 生态构建的,因此使用的是 Hasor 内置的 IoC 容器。@autowire 注解是 Spring 生态的东西,两者并不相通。
解决办法是
使用 QueryModule, SpringModule 组合
public class MyModule implements QueryModule, SpringModule {
public void loadModule(QueryApiBinder apiBinder) throws Throwable {
...
}
}
在加载 UdfSource 的时候利用 QueryApiBinder#loadUdfSource 的重载方法将 Bean 的创建委托给 Spring
方法一:
apiBinder.loadUdfSource(
apiBinder.findClass(DimUdfSource.class),// 找到标了 @DimUdfSource 注解的 UdfSource
aClass -> true, // 第一个参数中所有类型都被允许加载
springTypeSupplier(apiBinder) // 利用 TypeSupplier 可以将 Bean 的创建委托给 Spring
);
方法二:
apiBinder.loadUdfSource(
MyUdf.class, // UdfSource类型
springTypeSupplier(apiBinder) // 创建 MyUdf 委托给 Spring
);
springTypeSupplier 方法是 SpringModule 接口提供的。
这样就把 Bean 的创建工作全权委托给了 Spring,你的 Autowire 注解就不在话下了。
剩下的你需要做的就是 在 Spring 中声明 MyUdf.class 比如加一个 @Component 注解。
类如果实现了UdfSourceAssembly,那么@autowire注解注入的属性就是null了,不知是否正常