我正在评估将Apache AVRO用于我的泽西岛REST服务。我正在使用带有泽西岛REST的Springboot。
目前我接受JSON作为使用Jackson对象映射器转换为JavaPojos的输入。
我看了不同的地方,但我找不到任何使用Apache AVRO与泽西终端的例子。
我找到了这个Github存储库(https://github.com/FasterXML/jackson-dataformats-binary/),它有Apache AVRO插件。
我仍然找不到任何关于如何集成它的好例子。有人在泽西使用Apache AVRO吗?如果是,有什么我可以使用的例子吗?
有一个关于如何在JAX-RS REST服务中使用avro的全面演示(我写的)。avro的JAX-RS消息体读取器和编写器是在实现的,它们确实支持avro二进制、json、惯用json和csv(如果适用)。它们确实提供了对模式演化和投影的完全支持(通过http accept头)。有一系列文章详细解释了中演示的概念。此外,此演示项目在GKE上实时运行,您可以在上浏览openapi。Avro在项目中被用于所有内容、日志、度量和分析。
首先,需要做两件事:
应该是这样的:
@Provider
public class AvroMapperProvider implements ContextResolver<ObjectMapper> {
final AvroMapper avroMapper = new AvroMapper();
@Override
public ObjectMapper getContext(Class<?> type) {
return avroMapper;
}
}
将应用程序配置为使用Jackson作为消息处理程序:
public class MyApplication extends ResourceConfig {
public MyApplication() {
super(JacksonFeature.class,AvroMapperProvider.class);
}
}
或者,您可以实现一个自定义的MessageBodyReader和MessageBodyWriter,允许您在进出过程中直接处理有效负载:
public class AvroMessageReader implements MessageBodyReader<Person> {
AvroSchema schema;
final AvroMapper avroMapper = new AvroMapper();
public AvroMessageReader(){
schema = avroMapper.schemaFor(Person.class); //generates an Avro schema from the POJO class.
}
@Override
public boolean isReadable(Class<?> type, Type type1, Annotation[] antns, MediaType mt) {
return type == Person.class; //determines that this reader can handle the Person class.
}
@Override
public Person readFrom(Class<Person> type, Type type1, Annotation[] antns, MediaType mt, MultivaluedMap<String, String> mm, InputStream in) throws IOException, WebApplicationException {
return avroMapper.reader(schema).readValue(in);
}
}
这里,我们从一个假想的Person类生成一个avro模式。JAX-RS运行时将根据isReadable的响应选择此读取器。
然后,您可以将MessageBodyWorkers组件注入到服务实现类中:
@Path("app")
public static class BodyReaderTest{
@Context
private MessageBodyWorkers workers;
@POST
@Produces("avro/binary")
@Consumes("avro/binary")
public String processMessage() {
workers.getMessageBodyReader(Person.class, Person.class, new Annotation[]{}, MediaType.APPLICATION_JSON_TYPE);
}
}
回答您的最后一个评论:将处理程序上的mime类型设置为推荐的avro/二进制应该可以做到这一点。