我正在使用(KCL)和Spring。要使用KCL,我必须为接口RecordProcessor实现一个类(我将其命名为IRecordProcessor )。KCL将调用这个类和来自运动的过程记录。但是当我尝试使用依赖注入时,我发现它没有成功。
以下是RecordProcessor的片段
@Component
public class RecordProcessor implements IRecordProcessor {
@Autowired
private SingleRecordProcessor singleRecordProcessor;
@Override
public void initialize(String shardId) {
...
}
@Override
public void processRecords(List<Record> records, IRecordProcessorCheckpointer checkpointer) {
...
}
}我使用Class SingleRecordProcessor处理单个记录的运动。这是我的SingleRecordProcessor类片段:
@Component
public class SingleRecordProcessor {
private Parser parser;
private Map<String, Table> tables;
public SingleRecordProcessor() {
}
@Autowired
private void setParser(Parser parser) {
this.parser = parser;
}
@Autowired
private void setTables(Map<String, Table> tables) {
this.tables = tables;
}
public void process(String record) {
...
}
}我希望让spring框架自动将SingleRecordProcessor实例注入类并使用它。但是我发现字段singleRecordProcessor是空的。
知道为什么依赖注入失败了吗?还是不可能将依赖项注入到其他框架(本例中是KCL)调用的类中?如有任何建议,将不胜感激!真的需要帮助!!
更新
对不起,没有清楚地表达错误。错误是NullPointerException。我尝试在上面注入singleRecordProcessor并调用process()方法。我认为注入没有成功,因此实例singleRecordProcessor为null,而出现了NullPointerException。
详情如下:
我有一个主修课叫Application
@SpringBootApplication
public class Application{
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new ApplicationPidFileWriter("./app.pid"));
ConfigurableApplicationContext ctx = application.run(args);
}
}我有一个叫KCL的MainProcessor类。
@Service
public final class MainProcessor {
@EventListener(ApplicationReadyEvent.class)
public static void startConsumer() throws Exception {
init();
IRecordProcessorFactory recordProcessorFactory = new RecordProcessorFactory();
Worker worker = new Worker(recordProcessorFactory, kinesisClientLibConfiguration);
...
worker.run(); // this line will call KCL library and eventually call ProcessorRecord class.
}
}UPDATE2
RecordProcessorFactory只有一个这样的方法
@Component
public class RecordProcessorFactory implements IRecordProcessorFactory {
@Autowired
RecordProcessor recordProcessor;
@Override
public IRecordProcessor createProcessor() {
return recordProcessor;
}
}它为KCL创建一个新的RecordProcessor实例来使用它。
发布于 2018-08-18 06:29:42
您应该将此实例自动导入到MainProcessor中:
@Component
public class RecordProcessorFactory {
@Lookup IRecordProcessor createProcessor() { return null; }
}Spring将为您实例化一个RecordProcessorFactory,并将其中的createProcessor()实现替换为每次调用它时返回一个新IRecordProcessor的实现。工厂和处理器都将是Spring -这就是您想要的。
https://stackoverflow.com/questions/51904343
复制相似问题