Как применить «Функциональную регистрацию бина» в Spring Cloud Function для SpringBootApiGatewayRequestHandler - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь развернуть функцию AWS Lambda, написанную с использованием Spring Cloud Function 2.1.0, которая получает событие API Gateway.Поэтому я установил ApplicationContextInitializer, как показано ниже, а также SpringBootApiGatewayRequestHandler.К сожалению, я сталкиваюсь с исключением: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.springframework.messaging.Message (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information.

Я изучил тестовые случаи и примеры функций spring-cloud, но не смог найти пример для регистрации функционального компонента с Message параметром / возвращаемым значением.

@SpringBootConfiguration
public class ServiceConfiguration implements ApplicationContextInitializer<GenericApplicationContext> {

    public static void main(String[] args) {
        FunctionalSpringApplication.run(ServiceConfiguration.class, args);
    }

    public Function<Message<Pojo>,Message<Pojo>> transformMessage() {
        return request -> new GenericMessage<>(new Pojo(request.getPayload().getValue().toUpperCase()));
    }

    @Override
    public void initialize(GenericApplicationContext applicationContext) {
        applicationContext
                .registerBean("transformMessage", FunctionRegistration.class,
                        () -> new FunctionRegistration<>(transformMessage())
                                .type(FunctionType.from(Message.class).to(Message.class)));
    }

}
public class TransformMessageHandler extends SpringBootApiGatewayRequestHandler {
}

Может ли кто-нибудь указать мне на рабочий пример или дать подсказку о том, как правильно его зарегистрировать?

1 Ответ

0 голосов
/ 29 июня 2019

Из спецификаций вижу, что SpringBootApiGatewayRequestHandler extends SpringBootRequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent>.
Вместо того, чтобы ваша функция возвращала получение и возврат Message объектов, она должна работать с APIGatewayProxyRequestEvent и APIGatewayResponseEvent.

Метод, представляющий вашу логику функций, будет иметь такую ​​подпись:
public Function<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> transform()

Регистрация при инициализации выглядит следующим образом:

@Override
public void initialize(GenericApplicationContext applicationContext) {
    applicationContext
            .registerBean("transform", FunctionRegistration.class,
                    () -> new FunctionRegistration<>(transform())
                            .type(FunctionType.from(APIGatewayProxyRequestEvent.class).to(APIGatewayProxyResponseEvent.class)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...