java-restify
2.x
2.x
  • Visão geral
  • Início
    • Instalação
    • Início rápido
  • Anotações
    • Anotações padrão
    • Extensões
      • JAX-RS
      • Spring Framework
  • Tipos de conteúdo
    • Serialização e deserialização
    • Formatos
      • wildcard
      • application/json
        • Jackson
        • Gson
        • JSON-B
        • JSON-P
      • application/xml
        • JAX-B
      • application/x-www-form-urlencoded
        • Map
        • Parameters
        • @Form
      • multipart/form-data
        • MultipartFile
        • Map
        • MultipartParameters
        • @MultipartForm
      • text/plain
      • text/html
      • application/octet-stream
  • Tipos de retorno de método
    • Visão geral
    • Objetos suportados
    • Extensões
      • Guava
      • Jsoup
      • Frameworks reativos
      • Vavr
      • Spring Framework
  • Requisições assíncronas
    • Visão geral
    • Extensões
      • Apache Async HTTP Client
      • OkHtp
      • Netty
  • Programação reativa
    • Frameworks suportados
      • RxJava (1.x)
      • RxJava (2.x)
      • Project Reactor
  • Manipulação de erros
    • Manipulação de erros
  • Retry
    • Retry
  • Clientes HTTP
    • Visão geral
      • Requisições assíncronas
    • Extensões
      • Jersey HTTP Client
      • Apache HTTP Client
      • Apache Async HTTP Client
      • OkHtp
      • Netty
  • Netflix OSS
    • Hystrix
    • Ribbon
  • Spring Framework
    • Anotações
    • Retornos de método
    • RestTemplate
    • Spring Boot
  • Autenticação
    • Basic
    • OAuth 2
  • Lista de artefatos
    • Artefatos
Powered by GitBook
On this page
  • Como funciona?
  • Utilizando handlers
  • Outras implementações

Was this helpful?

  1. Tipos de retorno de método

Visão geral

Previousapplication/octet-streamNextObjetos suportados

Last updated 6 years ago

Was this helpful?

Como detalhado na , o java-restify tentará deserializar o corpo da resposta HTTP para o tipo de retorno do método, mas nem sempre esse será o comportamento desejado.

Eventualmente, podemos querer encapsular a resposta em algum outro objeto; por exemplo, poderíamos projetar nossa interface da seguinte maneira:

public interface MyApi {

  //utiliza Optional como retorno de método, para representar uma resposta potencialmente vazia
  @Path("/customers/{id}") @Get
  Optional<Customer> findCustomer(@PathParameter String id);
}

No exemplo acima, embora o retorno do método seja do tipo Optional, a resposta (se houver) deve ser deserializada para um objeto Customer. Ou seja, o tipo de retorno do método é diferente do tipo que representa a resposta.

Como funciona?

A propósito, o exemplo acima (Optional encapsulando o objeto de resposta) é perfeitamente possível e válido. O que permite esse tipo de composição é a interface EndpointCallHandler, um objeto que permite diferenciar e adaptar o objeto de resposta da requisição para o tipo de retorno do método.

O java-restify registra um conjunto de handlers para vários tipos de objetos diferentes. Os handlers são utilizados em um formato de chain of responsability, permitindo múltiplos níveis de composição e adaptação.

Por exemplo, outra possibilidade para o método acima seria uma execução assíncrona através de um Future:

public interface MyApi {

  //métodos que retornam Future serão executados assincronamente
  @Path("/customers/{id}") @Get
  Future<Optional<Customer>> findCustomer(@PathParameter String id);
}

No exemplo acima, o handler responsável por métodos que retornam Future irá adaptar a resposta do handler seguinte, que é o responsável por retornos do tipo Optional, que por sua vez utiliza um handler que não faz nenhuma adaptação, apenas retornando o objeto de resposta deserializado.

Instâncias de EndpointCallHandler são fornecidas por implementações de EndpointCallHandlerProvider, uma fábrica com duas especializações: EndpointCallHandlerAdapter, que gera handlers que adaptam outros handlers, e EndpointCallHandlerFactory, que fabrica handlers que convertem a resposta da requisição para outros tipos.

E se não houver algum handler específico para o tipo de retorno do método? Nos exemplos acima, utilizamos um objeto Customer do nosso próprio modelo para representar a resposta:

public interface MyApi {

  Customer findCustomer(@PathParameter String id);
}

O método acima retorna um Customer mas não existe um handler específico para esse tipo; nesse cenário, será utilizado uma implementação de EndpointCallHandler que não realiza nenhuma adaptação, assumindo que o tipo de resposta da requisição é mesmo tipo de retorno do método.

Utilizando handlers

Os handlers fornecidos pelo java-restify são registrados automaticamente, caso estejam disponíveis no classpath.

É possível registrar novos handlers facilmente:

MyApi myApi = new RestifyProxyBuilder()
  .handlers()
    .add(new MyEndpointCallHandlerFactory())
    .and()
  .target(MyApi.class)
    .build();

Eventualmente pode ser necessário desligar a descoberta automática:

MyApi myApi = new RestifyProxyBuilder()
  .handlers()
    .discovery()
      .disabled() // desabilita a descoberta automática (habilitada por padrão)
    .and()
  .target(MyApi.class)
    .build();

Outras implementações

O java-restify também oferece suporte para objetos específicos de alguns frameworks:

  • Frameworks reativos

Cada implementação de EndpointCallHandler é responsável por um formato ou assinatura de método em particular, como um tipo de retorno específico ou a presença de alguma anotação. O java-restify fornece várias implementações, suportando muitos casos de uso diferentes. Consulte os .

Requisições assíncronas também podem depender do tipo de retorno do método, como o exemplo anterior utilizando um Future. Consulte a , e os

O também fornece mais opções para retorno de método.

documentação sobre serialização e deserialização
tipos de retorno suportados por padrão
documentação detalhada sobre requisições assíncronas
tipos de retorno assíncronos suportados por padrão
Guava
Jsoup
Vavr
suporte ao Spring