Spring Cloud 関数 AWS Adapter SpringBootRequestHandler を使用して AWS ラムダ関数作成ハンドラーを実装しています。GenericApplicationContext に登録された機能 Bean が呼び出されますが、コンポーネント クラスのオートワイヤリングで NullPointer Exception が発生しています。
Spring Application でベースパッケージの @ComponentScan を試しました。
アプリケーション クラス:
@Slf4j
@SpringBootApplication
@ComponentScan({ "com.poc.evthub" })
@EnableConfigurationProperties(EventHubProperties.class)
public class EventHubServerlessApplication implements ApplicationContextInitializer<GenericApplicationContext> {
public EventHubServerlessApplication() {
}
public static void main(String[] args) throws Exception {
FunctionalSpringApplication.run(EventHubServerlessApplication.class, args);
}
@Bean
public KinesisEventFunction ingestEvents() {
return new KinesisEventFunction();
}
@Override
public void initialize(GenericApplicationContext context) {
log.debug("======== initialize ========");
context.registerBean("ingestEvents", FunctionRegistration.class,
() -> new FunctionRegistration<Function<KinesisEvent, ApiResponse>>(ingestEvents())
.type(FunctionType.from(KinesisEvent.class).to(ApiResponse.class).getType()));
}
}
ハンドラ:
public class KinesisEventHandler extends SpringBootRequestHandler<KinesisEvent, ApiResponse> {
}
機能性ビーン:
package com.poc.evthub.function;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
import com.poc.evthub.beans.ApiResponse;
import com.poc.evthub.constant.Constants;
import com.poc.evthub.service.IngestionServiceFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.function.Function;
@Slf4j
@Component
public class KinesisEventFunction implements Function<KinesisEvent, ApiResponse> {
private Context context = null;
@Autowired
private IngestionServiceFactory ingestionServiceFactory;
@Autowired
@Qualifier("targetExecutionContext")
public void setContext(Context context) {
log.info("Context: {}", context);
this.context = context;
}
@Override
public ApiResponse apply(final KinesisEvent kinesisEvent) {
log.info("KinesisEventFunction apply called...");
String sourceDomain = System.getenv(Constants.SYSENV.SOURCE_DOMAIN);
log.info("Source Domain = {}", sourceDomain);
if(null == kinesisEvent || null == kinesisEvent.getRecords()) {
log.error("Event contains no data. {}", System.lineSeparator());
//TODO build response NOT FOUND
return null;
}
else
log.info("Received {} records from {}. {}",
kinesisEvent.getRecords().size(),
kinesisEvent.getRecords().get(0).getEventSourceARN(),
System.lineSeparator());
log.info("ingestionServiceFactory = {}",ingestionServiceFactory);
ingestionServiceFactory.ingest();
return null;
}
}
完全なコードと pom は https://github.com/rjavaria/eventhub-serverlessにアップロードされています。
KinesisEventFunction apply called... また、ラムダから環境値 (source_domain) を読み取り、Kinesis イベント レコードを受信することができます。
しかし、@Autowired ingestionServiceFactory は null です。このコンポーネント Bean を注入して、ビジネス ロジックを委任します。
ここで何が見逃されているので、春はこのコンポーネント Bean を注入できませんか?
前もって感謝します!