'Command' resulted in com.thoughtworks.xstream.io.StreamException()

Hi I have this error when try to sendingCommand using commandGateway ,

‘Command’ resulted in com.thoughtworks.xstream.io.StreamException()

please help

Hi,

Can you please provide a stacktrace (including the error message) and the actual command you are trying to send?

Best regards,

Nils

Hi Nils ,

Here is my upcaster :

@Log4j2
@Component
public class MyClassupcaster extends SingleEventUpcaster {
private static final String ABSENCE_DAYS = “absenceDays”;
private static final String UPDATED_BALANCE = “updatedBalance”;

private static final SimpleSerializedType TARGET_TYPE =
new SimpleSerializedType(MyEventExample.class.getTypeName(), “1.0”);

@Override
protected boolean canUpcast(IntermediateEventRepresentation intermediateEventRepresentation) {
return intermediateEventRepresentation.getType().equals(TARGET_TYPE);
}

@Override
protected IntermediateEventRepresentation doUpcast(
IntermediateEventRepresentation intermediateEventRepresentation) {
return intermediateEventRepresentation.upcastPayload(
new SimpleSerializedType(TARGET_TYPE.getName(), “2.0”),
org.dom4j.Document.class,
document → {
List content = document.getRootElement().content();
for (Node node : content) {
Element element = (DefaultElement) node;
if (node.getName().equals(ABSENCE_DAYS)) {
BigDecimal absenceDays = new BigDecimal(node.getText());
node.setText(absenceDays.toString());
}

        if (node.getName().equals(UPDATED_BALANCE)) {
          BigDecimal takenDays = new BigDecimal(element.element("takenDays").getText());
          BigDecimal entitlementDays =
              new BigDecimal(element.element("entitlementDays").getText());
          BigDecimal plannedDays = new BigDecimal(element.element("plannedDays").getText());
          BigDecimal sickLeaveDays = new BigDecimal(element.element("sickLeaveDays").getText());
          BigDecimal pendingDays = new BigDecimal(element.element("pendingDays").getText());
          BigDecimal ptoDays = new BigDecimal(element.element("ptoDays").getText());

          element.setText(takenDays.toString());
          element.setText(entitlementDays.toString());
          element.setText(plannedDays.toString());
          element.setText(sickLeaveDays.toString());
          element.setText(pendingDays.toString());
          element.setText(ptoDays.toString());
        }
      }
      return document;
    });

}

I have changed the type of the field at my event and wanted to upcast the field from integer to bigdecimal , but this error always comes up :

org.axonframework.serialization.CannotConvertBetweenTypesException: Cannot build a converter to convert from [B to org.dom4j.tree.DefaultDocument
	at org.axonframework.serialization.ChainedConverter.calculateChain(ChainedConverter.java:59) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.serialization.ChainingConverter.convert(ChainingConverter.java:95) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.serialization.Converter.convert(Converter.java:71) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.serialization.upcasting.event.UpcastedEventRepresentation.getData(UpcastedEventRepresentation.java:92) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.serialization.LazyDeserializingObject.getObject(LazyDeserializingObject.java:102) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.serialization.SerializedMessage.getPayload(SerializedMessage.java:77) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.messaging.MessageDecorator.getPayload(MessageDecorator.java:56) ~[axon-messaging-4.5.10.jar!/:4.5.10]
	at org.axonframework.messaging.annotation.PayloadParameterResolver.resolveParameterValue(PayloadParameterResolver.java:41) ~[axon-messaging-4.5.10.jar!/:4.5.10]

Hi,

I am confused. I though your issue was about a command not being sendable? What has this to do with the upcaster?

Best regards

Nils

Hi,

Apart from that: Converting a byte array into a Dom4J instance should be a quite easy route for Axon: ByteArrayToInputStreamConverter + InputStreamToDom4jConverter. The latter is registered by the XStreamSerializer. So my first thought would be a misconfiguration, e.g. configuring Jackson as Serialization format and then still using (the XML based) org.dom4j.Document.

Best regards

Nils

Sorry for confusion the first problem was with command and it’s only happened when I hit the endpoint using postman, I tried different way to test using integration test and then the upcaster problem appeared the good things was I solved it to change Jackson to XStream because my axon event sourcing table by default using XStream format while my events using jacksonized and you’re right, Thank you so much!

Hi
which version of the Framework are you using?

In Axon Framework version 4.5.X introduced a bit of change in the Serializer. I expect that your configuration for the generalSerializer is not in place.
Can you share it?
Is this a previously running application or a new one?

I leave you two code snippet that maybe will help to solve your issue
First, let’s create a configuration for the generalSerializer

@Configuration
public class SerializerConfiguration {

    @Bean("generalSerializer")
    @Primary
    public Serializer generalSerializer(XStream xStream) {
        return XStreamSerializer.builder()
                                .xStream(xStream)
                                .lenientDeserialization()
                                .build();
    }
}

And then let’s configure it in the application.yml for your axonframework client application

axon:
  serializer:
    general: xstream
    messages: jackson
    events: jackson

In my configuration snippet, I also configure jackson as a serializer for messages and events.