最近在写jfinal整合netty的模块,但同时需要借助jfinal本身作为web容器,方便读取数据库等;但现在通过反射实例化Controller对象时,@Inject注解不生效,无法注入Service对象。
@SocketModule(module = ModuleId.USER) public class UserHandler extends Controller { @Inject private UserService userService; @SocketCommand(cmd = UserCmd.LOGIN) public void login(Session session, byte[] data) { String params = new String(data); JSONObject reqObj = JSON.parseObject(params); return Kv.by(CommonConsts.MSG, "success").set(CommonConsts.DATA, userService.findAll()); } }
public Object invoke(Object... paramValues) { try { return method.invoke(target.newInstance(), paramValues); } catch (IllegalAccessException | InstantiationException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return null; }
大概知道问题在哪里了?第一,action注参对象类型只能是java bean或model;第二,@Inject注入,需要通过http请求来初始化,所以我现在使用反射clazz.newinstance无法注入。
功能需求主要是:借用jfinal的controller机制实现注入service,并且通过不同的函数划分tcp模块;之前是用spring实现的,这次想改用jfinal实现,发现并没有spring方便。实在不行就使用springboot算了。
---------------------------
问题已解决,第一,java bean需要默认无参构造,及get set方法;第二,手动注入inject即可
Controller controller = (Controller) target.newInstance(); com.jfinal.aop.Aop.inject(controller); return method.invoke(controller, paramValues);
jfinal 能使用 @Inject 的前提条件是:对象在源头上是 jfinal 创建的
例如,为啥 controller 中可以使用 @Inject,是因为 Controller 对象是 jfinal 创建的
再例如,为啥 Service 中可以使用 @Inject , 是因为 Controller 是 jfinal 创建的,而 Service 又是在 Controller 中被注入的,整个 @Inject 链条的顶端只要是 jfinal 创建的就可以 @Inject 一直注入下去
这个在文档中有详细的说明