Я пытаюсь использовать сочетание Flink и Springboot, и у меня возникли некоторые проблемы. Допустим, у меня есть этот поток.
- Получение json строки с одной датой поля, содержащей строку даты.
- с использованием функции map и ObjectMapper для анализа ее в объекте LocalDateTime
- print
Это простой пример использования, который опишет мой зонд.
Итак, у меня есть Word, представляющий класс Word, содержащий поле LocalDateTime.
@Data
public class Word {
@JsonDeserialize(using = LocalDateTimeSerde.class)
LocalDateTime date;
}
LocalDateTimeDeserlization выглядит так (я хочу автоматически связать конфигурацию приложения):
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@JsonComponent
public class LocalDateTimeSerde extends JsonDeserializer<LocalDateTime> {
private final AppConf conf;
@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(this.conf.getDateFormatter());
return LocalDateTime.parse(jsonParser.getText(), formatter);
}
}
AppConf. java повторная настройка конфигурации приложения:
@Data
@Configuration
@ConfigurationProperties(value = "app")
public class AppConf {
private String dateFormatter;
}
DemoApplication. java:
final StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment(1);
String example = "{\"date\":\"2019-01-29 00:00\"}";
var stream = env
.fromElements(example)
.map(x->new ObjectMapper().readValue(x,Word.class))
.returns(Word.class);
stream.print();
env.execute("Demo App");
Исключение, которое я получаю:
Caused by: java.lang.IllegalArgumentException: Class com.example.demo.LocalDateTimeSerde has no default (no arg) constructor
Основная проблема заключается в том, что код десериализации выполняется на TaskManager и там Springboot не принимает участия, поэтому он не внедряет AppConf в класс.
Добавление @NoArgsConstructor не решит проблему
I Мне кажется, я знаю, почему это происходит (потому что flink master сериализует классы рабочим, а затем springboot не «ScanComponents» и получает контроль.
Есть ли какое-то решение для этого? Я действительно хочу совместить весну с мерцанием и в функции рабочего.
Спасибо.