#java #spring-boot #axon
Вопрос:
Я использую Axon
2.4.6
. У меня есть сага, полезная нагрузка которой была сериализована в двоичном формате XStreamSerializer
.
Сага выглядит так:
public class MySaga extends AbstractAnnotatedSaga {
...
private MyEvent myEvent;
...
}
Он содержит одно событие, которое является событием инициализации связанного объекта aggregate.
Прямо сейчас у меня есть проблема десериализации, потому что я изменил MyEvent
ее, добавив к ней одно свойство. Я нашел обходной путь к этому, добавив идентификатор сериализации, который ожидает десериализатор, однако это решение может быть не лучшим, поскольку я сейчас работаю с производственными данными, и было бы неплохо, если бы я смог каким-то образом поднять саги.
Поэтому то, что я намерен сделать, — это создать пользовательский сериализатор, который расширяет JavaSerializer
и настраивает SerializedObject<S>
то, что входит. Проблема в том, что сериализованный объект находится в шестнадцатеричном/двоичном формате, поэтому мне нужен способ преобразовать его org.dom4j
, например, в объект, чтобы я мог добавить отсутствующее свойство, а затем десериализовать его в MySaga.
Я попробовал несколько подходов, таких как
ByteArrayInputStream bos = new ByteArrayInputStream((byte [])serializedObject.getData());
или new XStream();
но все они идут от двоичного представления прямо к десериализации объекта, что мне нужно, так это сначала получить преобразование dom4j или даже xml. Я не могу понять, как это сделать.
Комментарии:
1. Пожалуйста, укажите, какую версию AxonFramework вы используете. Кроме того, пожалуйста, предоставьте более подробную информацию о том, что вы намерены делать, что вы ожидаете, что произойдет, и что не работает.
2. @MilenDyankov надеюсь, теперь все стало яснее
3. В документации предлагается реализовать пользовательский преобразователь типов содержимого. docs.axoniq.io/reference-guide/axon-framework/events/… См., в частности. второй абзац.
4. Вы пытались найти вдохновение в исходном коде фреймворка? Возможно github.com/AxonFramework/AxonFramework/tree/master/messaging/… может тебе помочь..
5. Хотя сейчас уже немного поздно для этого, я все равно хотел бы добавить этот кусочек. Было бы лучше не содержать объект события в вашей Саге. Вместо этого просто извлеките нужные вам поля из события. Таким образом, вы не стали бы связывать экземпляры Саги с версиями событий. Может быть, что-то, на что стоит обратить внимание в будущем.
Ответ №1:
Я должен сказать, что Axon 2-это не то, с чем у меня есть опыт, но, тем не менее, позвольте мне попытаться вам помочь.
Как я могу найти в документах, Axon предоставляет пример того, как написать апкастер здесь, используя правильную ссылку на документацию 2.4.
Что мне непонятно, исходя из вашего вопроса, так это то, используете ли вы JavaSerializer
или XStreamSerializer
(или JacksonSerializer
для его завершения).
В случае , если вы используете XML
, в документах будет приведен пример восходящего канала. Что хорошо упомянуть (и проверить), так это то, что вы также можете изучить xStream.ignoreUnknownElements()
, что сделает ваш сериализатор мягким, что означает, что он не потерпит неудачу при попытке десериализации чего-либо, содержащего атрибут, которого он не знает (я бы сказал, очень полезно).
Если вы используете JSON
, у вас также есть FAIL_ON_UNKNOWN_PROPERTIES
«функция», которую в этом случае можно отключить, чтобы сделать ее более мягкой.
Если вы спросите меня, то сделать ваши сериализаторы мягкими кажется правильным путем. Если вам действительно нужно добавить значение по умолчанию/производное значение в новое поле, то вам следует выбрать маршрут восходящей передачи.
кр.,
Правка 1: вызванная комментарием Стивена, это побудило меня добавить эту правку и спросить вас, как долго, по вашему мнению, будет жить эта Сага. Теперь, когда я заметил, что Событие является частью вашей Саги, я бы предпочел написать новую Сагу, которая не содержит Событие как его часть, а просто поля, не связывающие его с каким-либо конкретным событием.