@Inject注解不生效

最近在写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

2019-09-05 16:07

解决就好

jfinal 能使用 @Inject 的前提条件是:对象在源头上是 jfinal 创建的

例如,为啥 controller 中可以使用 @Inject,是因为 Controller 对象是 jfinal 创建的

再例如,为啥 Service 中可以使用 @Inject , 是因为 Controller 是 jfinal 创建的,而 Service 又是在 Controller 中被注入的,整个 @Inject 链条的顶端只要是 jfinal 创建的就可以 @Inject 一直注入下去

这个在文档中有详细的说明

maxwade

2019-09-05 22:13

@JFinal 我自己手动注入即可,即使不是Controller对象也能采用这个函数com.jfinal.aop.Aop.inject(controller);注入

JFinal

2019-09-05 23:29

@maxwade 不能使用 @Inject 的地方,可以使用 Aop.get(...) 以及 Aop.inject(...)

建议使用前者,因为前者还可以有单例功能

maxwade

2019-09-06 09:56

@JFinal 懂了,Aop.inject()是不是没有单例功能?

JFinal

2019-09-06 10:01

@maxwade Aop.inject 也有单例可能,注入时用到的目标对象也有单例功能

前面所说的 Aop.get(...) 有单例功能是指:获取的对象就有单例功能

Aop.get(Aaa.class) 与 Aop.inject(aaaObject) 的本质区别是:前者 Aaa 的创建是有单例功能的,而后者的 aaaObject 是你自己创建的,所以这个是否要有单例功能就是你自己控制的了

maxwade

2019-09-06 10:32

@JFinal 明白了,ActionHandler中采用Aop.inject(Controller)是因为每次Controller都是new出来的,所以用Aop.inject(aaObject);

热门反馈

扫码入社