FasterXML / jackson-dataformats-binary

Uber-project for standard Jackson binary format backends: avro, cbor, ion, protobuf, smile
Apache License 2.0
310 stars 133 forks source link

Avro schema generation: allow override namespace with new `@AvroNamespace` annotation #310

Closed fleetwoods closed 2 years ago

fleetwoods commented 2 years ago

I was hoping to override the namespace used in the schemas generated by AvroSchemaGenerator for my POJOs, as opposed to the package name that is used (as it does not make sense to the consumers of my topic, outside of my application).

I cannot workout a means to do this, I tried @JsonRootName(value = "ClassName", namespace = "my.domain") but that is not picked up, is there any other means to achieve this?

Note this is not the same as @JsonAlias, I would like to control the namespace, not the aliases.

Code currently used:

    public static AvroSchema generateSchema(final Class<?> clazz) {
        final AvroSchemaGenerator gen = new AvroSchemaGenerator();
        gen.enableLogicalTypes();
        try {
            MAPPER.acceptJsonFormatVisitor(clazz, gen);
        } catch (JsonMappingException e) {
            throw new IllegalArgumentException("Cannot generate schema for: " + clazz, e);
        }
        return gen.getGeneratedSchema();
    }
cowtowncoder commented 2 years ago

As things are, namespace is unfortunately only used with XML backend. But conceptually I can see how this could be useful for Avro as well.

If anyone has time to try a PR I'd be happy to help, but I do not have time to work on this directly myself.

One small thing about possible implementation: this should be an opt-in feature, for backwards compatibility. I can help with that aspect if need be.

MichalFoksa commented 2 years ago

Hi @cowtowncoder

I think I found simple way how to override default Avro namespace value with a new, custom, annotation.

Please , see #324.

cowtowncoder commented 2 years ago

Will be released as part of 2.14.0.