Предполагая, что я могу отправлять сообщения через Kafka или RabbitMQ и использовать их с помощью @StreamListener.
Биндеры настроены на тип содержимого = 'application/json', поэтому я думаю, что можно было бы добавить условия для полезной нагрузки.
Мое требование состоит в том, чтобы получать элементы только тогда, когда дата поля предшествует текущему моменту(). Все остальные элементы будут потребляться, когда это условие будет истинным.
Например, я ожидаю что-то вроде:
@StreamListener(value = INPUT, condition = "data.startDate > now()")
public void onMessage(@Payload Data data) {
// ...
}
Первая проблема заключается в том, что я получаю сообщение об ошибке: EL1008E: свойство или поле «startDate» не может быть найдено в объекте типа «байт []» — возможно, оно не общедоступно или недействительно?




Это правильно, так как полезная нагрузка не преобразуется в какой-либо тип и существует в необработанном виде, то есть byte[]. См. подраздел эта секция, в частности «Согласование типа контента в контексте условия».
Однако в вашем случае вы можете просто изменить свое выражение, чтобы оно было чем-то вроде new String(payload)...., зная, что это всегда byte[], прежде чем оно будет преобразовано.
ну, это потому, что мы не предполагаем автоматически, что пользователь всегда хочет String, поэтому, пока мы не узнаем тип, он является необработанным, следовательно, byte[]. Кроме того, ваш пример фактически объяснен в документе, который я разместил. Мы НЕ можем преобразовать в объект Data, пока не узнаем, что будем вызывать этот обработчик. Тем не менее, я чувствую, что, возможно, будут нужны дополнительные разъяснения, поэтому постараюсь обновить документ.
Действительно, вы правы. Это то, что я только что прочитал в доке. Еще раз спасибо.
Я думаю, что ответ есть в документации и соответствует ответу Олега
That is because you are testing something that does not yet exist in a state you expect. That is because the payload of the message is not yet converted from the wire format (byte[]) to the desired type. In other words, it has not yet gone through the type conversion process described in the Chapter 10, Content Type Negotiation.
So, unless you use a SPeL expression that evaluates raw data (for example, the value of the first byte in the byte array), use message header-based expressions (such as condition = "headers['type']=='dog'").
Спасибо Олег. Раздел не содержит подробностей о том, как пишется условие из полезной нагрузки. Почему я должен анализировать byte[] mysefl? Я могу выполнить синтаксический анализ в String, а затем в Object с помощью JSOn, но это кажется немного громоздким! Более того, простой пример даже со строковым условием не работает из-за упомянутой мной ошибки. Я добавил примеры для пояснения.