Customize event payload type

@Morlack Thank you very much for your quick reply!!

I have seen that there may be problems with refactoring from Refactoring where events are (packaging-wise), what happens to events already in evenstore (MongoDB).

that’s why i want to know how to implement custom payload type.

public class ShorterJacksonSerializer extends JacksonSerializer {

    protected ShorterJacksonSerializer(Builder builder) {
        super(builder);
    }

    String basePackage = "com.example.axon";

    protected String resolveClassName(SerializedType serializedType) {
        return basePackage + "." + serializedType.getName();
    }

    @Override
    public SerializedType typeForClass(Class type) {
        if (type.getName().startsWith(basePackage)) {
            String shortName = type.getName().replace(basePackage + ".", "");
            return new SimpleSerializedType(shortName, getRevisionResolver().revisionOf(type));
        }
        throw new IllegalArgumentException("All payloads have to match base class " + basePackage);
    }
}

after using above code, i can see o.a.c.gateway.DefaultCommandGateway : Command 'com.example.axon.CreateSampleCommand' resulted in org.axonframework.eventsourcing.eventstore.EventStoreException(Cannot reuse aggregate identifier [SampleId(id=4_101_101)] to create aggregate [SampleAggregate] since identifiers need to be unique.) Exception.

public class ShorterJacksonSerializer extends JacksonSerializer {

    protected ShorterJacksonSerializer(Builder builder) {
        super(builder);
    }

    String basePackage = "com.example.axon";

    protected String resolveClassName(SerializedType serializedType) {
        return basePackage + "." + serializedType.getName();
    }

    @Override
    public SerializedType typeForClass(Class type) {
        if (type.getName().startsWith(basePackage)) {
            String shortName = type.getName().replace(basePackage + ".", "");
            return new SimpleSerializedType(shortName, getRevisionResolver().revisionOf(type));
        } else {
           return SimpleSerializedType(type.name, revisionResolver.revisionOf(type))
        }
    }
}

but after using above code, i can see only EventClass payload.
so It works!! but I don’t understand why it works.

Could you explain it plaese?

thanks.

1 Like