No java-restify, serialização se refere ao mecanismo utilizado para escrever o corpo da requisição ; e deserialização se refere ao mecanismo utilizado para ler o corpo da resposta.
Ambos são feitos de maneira transparente; a serialização se aplica ao parâmetro do método que representa o corpo (anotado com @RequestBody, no caso das anotações padrão), e a deserialização se aplica ao tipo de retorno do método.
Formatos
O formato utilizado na serialização e deserialização é determinado pelo cabeçalho Content-Type.
O java-restify fornece várias implementações para lidar com tipos específicos de conteúdo, e essas implementações também influenciam argumentos e retornos de método que podem ser utilizados.
Os serializadores, responsáveis por converter um objeto para um determinado formato e escrever no corpo da requisição, são implementações da interface HttpMessageWriter.
Os deserializadores, responsáveis por converter o corpo da resposta (em um formato qualquer) para um objeto, são implementações da interface HttpMessageReader.
Essas duas interfaces extendem HttpMessageConverter, que fornece o tipo de conteúdo que aquele objeto é capaz de lidar. Caso você precise serializar/deserializar formatos não suportados pelo java-restify, basta implementar HttpMessageWriter (para serialização) ou HttpMessageReader (para deserialização) ou ambos, e registrar seu converter customizado.
importcom.github.ljtfreitas.restify.http.client.message.ContentType;importcom.github.ljtfreitas.restify.http.client.message.converter.HttpMessageReadException;importcom.github.ljtfreitas.restify.http.client.message.converter.HttpMessageReader;importcom.github.ljtfreitas.restify.http.client.message.converter.HttpMessageWriteException;importcom.github.ljtfreitas.restify.http.client.message.converter.HttpMessageWriter;importcom.github.ljtfreitas.restify.http.client.message.request.HttpRequestMessage;importcom.github.ljtfreitas.restify.http.client.message.response.HttpResponseMessage;publicclassMyCustomConverterimplementsHttpMessageReader<Object>,HttpMessageWriter<Object>{@OverridepublicContentTypecontentType(){returnContentType.of("text/whatever");}@OverridepublicbooleancanWrite(Class<?>type){ // verifica se essa implementação é capaz de serializar o tipo de objetoreturnfalse;}@Overridepublicvoidwrite(Objectbody,HttpRequestMessagehttpRequestMessage)throwsHttpMessageWriteException{ // escreve o objeto no corpo da requisição}@OverridepublicbooleancanRead(Typetype){ // verifica se essa implementação é capaz de deserializar a resposta para esse tipo de objetoreturnfalse;}@OverridepublicObjectread(HttpResponseMessagehttpResponseMessage,TypeexpectedType)throwsHttpMessageReadException{ // lê a resposta e converte para o objeto esperadoreturnnull;}}MyApi myApi =newRestifyProxyBuilder().converters().add(new MyCustomConverter()).and().target(MyApi.class).build();
Os únicos converters registrados por padrão são capazes de deserializar qualquer tipo de conteúdo (Content-Type=*/*), e podem apenas ler respostas.
Também é possível implementar um controle fino dos converters utilizados, selecionando apenas os que fizerem sentido para o seu caso de uso.
Eventualmente também pode ser necessário desligar o registro automático dos converters disponíveis no classpath.
Caso você registre algum converter customizado, as configurações padrão do java-restify serão sobrescritas e apenas os converters registrados manualmente serão utilizados.
Formatos suportados
O java-restify fornece implementações para alguns tipos de conteúdo:
// todos os formatos listados acima, se disponíveis no classpath, serão registrados
MyApi myApi = new RestifyProxyBuilder()
.target(MyApi.class)
.build();
MyApi myApi = new RestifyProxyBuilder()
.converters()
.json() //apenas json será automaticamente registrado, se estiver disponível no classpath
.and()
.target(MyApi.class)
.build();
MyApi myApi = new RestifyProxyBuilder()
.converters()
.xml() //apenas xml será automaticamente registrado, se estiver disponível no classpath
.and()
.target(MyApi.class)
.build();
MyApi myApi = new RestifyProxyBuilder()
.converters()
.discovery()
.disabled() // desabilita a descoberta automática de converters
.json()
.and()
.target(MyApi.class)
.build();
MyApi myApi = new RestifyProxyBuilder()
.converters()
.add(new MyCustomConverter()) //apenas esse converter será utilizado
.and()
.target(MyApi.class)
.build();
// demais converters, se forem necessários, também devem ser incluídos explicitamente
MyApi myApi = new RestifyProxyBuilder()
.converters()
.add(new MyCustomConverter())
.json() // além do converter acima, json também será suportado, se estiver disponível no classpath
.and()
.target(MyApi.class)
.build();