如何在运行时自动连接动态服务类和方法名称

时间:2019-07-13 02:17:59

标签: spring autowired

我正在进行一个项目,其中kafka消费者代码负责调用业务服务和方法。 所有这些都可以正常工作,直到服务类具有自动连接的服务为止。 那些自动装配因NPE而失败。

我知道在Spring IOC之外调用服务不会启用自动装配。 是否有一个干净的解决方法,我的约束是我不能在业务服务端更改代码。 每个业务服务都是不同的微服务的一部分。

这是从kafka用户端调用方法的片段: 服务类和方法名称是在运行时从DB获得的,作为配置的一部分,可以更改或重新配置。  / 此处的呼叫服务在重试后尝试捕获,最后允许出现故障的dtls /         尝试{

        Class<?> c = Class.forName(sdfServiceClass);


        Method consumerMethod
                = c.getDeclaredMethod(
                sdfServiceMethod, Context.class, Object.class, String.class);

        Context context_con = (Context) result[0];


        consumerMethod.invoke(c.newInstance(), context_con, result[1], messageuid_con);


    } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException |
            InstantiationException | InvocationTargetException e) {

上面被调用的业务服务:

公共类serviceclassA {

@Autowired
private JobLocator jobLocator;
@Autowired
@Qualifier("sbjobLauncher")
private SimpleJobLauncher sbjobLauncher;
@Autowired
JobRepository jobRepository;
@Autowired
SbJobService sbJobService;



public void ServiceMethod(Context context, Object item, String messageUid) {

问题是此类具有自动接线,而该接线不是由Spring IOC发起的。

错误: java.lang.NullPointerException:空 在业务服务中调用自动装配类的地方

1 个答案:

答案 0 :(得分:0)

已解决:

Class c = Class.forName(sdfServiceClass);

        Object listnerClass =Class.forName(sdfServiceClass).newInstance();
        autowireCapableBeanFactory.autowireBean(listnerClass);
        Method consumerMethod
                = c.getDeclaredMethod(
                sdfServiceMethod, Context.class, Object.class, String.class);

        Context context_con = (Context) result[0];


        consumerMethod.invoke(listnerClass, context_con, result[1], messageuid_con);