Diferença entre a anotação spring @Controller e @RestController

357

Diferença entre primavera @Controllere @RestControlleranotação.

A @Controlleranotação pode ser usada para aplicativos Web MVC e REST?
Se sim, como podemos diferenciar se é um aplicativo Web MVC ou REST.

Srikanth
fonte

Respostas:

471
  • @Controller é usado para marcar classes como Spring MVC Controller.
  • @RestControlleré uma anotação de conveniência que nada mais faz do que adicionar anotações @Controllere @ResponseBody(consulte: Javadoc )

Portanto, as duas definições de controlador a seguir devem fazer o mesmo

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
micha
fonte
48
Acho que o @RestController também converte a resposta para JSON / XML automaticamente.
Arnabkaycee
11
Apenas compartilhar um link para um tutorial Primavera explicar a diferença spring.io/guides/gs/rest-service
Mina Samy
9
Além disso, se você usar o mecanismo de modelo, Thymeleafele não funcionará @RestControllerdevido ao @ResponseBodyque está incluído nesta anotação.
Sonique
3
@ResponseBodyfaz com que os objetos retornados para algo que poderia ser no corpo, por exemplo, JSON ou XML ( fonte )
Martin Thoma
59

No código abaixo, mostrarei a diferença entre @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

e @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

o @ResponseBodyé ativado por padrão. Você não precisa adicioná-lo acima da assinatura da função.

BERGUIGA Mohamed Amine
fonte
11
Os nomes de classe em Java devem começar em maiúsculas, ou seja, RestClassName (não restClassName).
Razzle
24

Se você usar, @RestControllernão poderá retornar uma exibição (usando Viewresolverem Spring / springboot) e sim @ResponseBodynão é necessário neste caso.

Se você usar, @Controllerpoderá retornar uma visualização no Spring Web MVC.

Ravi Wadje
fonte
Sim, @ResponseBody pode ser colocado em um método e indica que o tipo de retorno deve ser escrito diretamente para o corpo da resposta HTTP (e não colocado em um modelo, ou interpretado como um nome de vista)
PraveenKumar Lalasangi
14

Na verdade, tenha cuidado - eles não são exatamente iguais.

Se você definir quaisquer interceptores no seu aplicativo, eles não se aplicarão aos Controladores anotados @RestController, pois eles funcionam com os @Controllercontroladores anotados.

ie configuração para o interceptador:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

e na declaração de um controlador Spring:

@Controller
public class AdminServiceController {...

Vai funcionar, no entanto

@RestController
public class AdminServiceController {...

não acaba tendo o interceptador associado a ele.

Bertybro
fonte
2
@RestControllerfoi introduzido no Spring 4x. Essa anotação também é anotada por si mesma; @Controllerportanto, se não estiver funcionando como um @Controllerrelatório, relate isso como um bug.
Gaoagong 1/10
@bertybro, isso não está certo. Você pode associar um Interceptora um @RestController.
Ravi-A-Doer
Eu certamente anexei com êxito um Interceptora um @RestController.
Ben Barden
11

Como você pode ver na documentação do Spring ( Documentação do Spring RestController ), a anotação Rest Controller é igual à anotação do Controller, mas assumindo que @ResponseBody está ativo por padrão, portanto, todo o json é analisado em objetos java.

CAAY
fonte
4

A nova anotação @RestController no Spring4 +, que marca a classe como um controlador em que todo método retorna um objeto de domínio em vez de uma exibição. É uma abreviação de @Controller e @ResponseBody reunidos.

yancy
fonte
3

@RestControllerfoi fornecido desde a Primavera 4.0.1. Esses controladores indicam que aqui os métodos @RequestMapping assumem a semântica @ResponseBody por padrão.

Nas versões anteriores, a funcionalidade semelhante poderia ser alcançada usando abaixo:

  1. @RequestMappingjuntamente com @ResponseBodycomo@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> pode ser usado como uma das maneiras de usar JSON com Jackson ou xml.

  3. MyBean pode ser definido como

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @ResponseBody é tratado como a visualização aqui entre o MVC e é despachado diretamente, em vez de ser despachado do Dispatcher Servlet e os respectivos conversores convertem a resposta no formato relacionado, como text / html, application / xml, application / json.

No entanto, o Restcontroller já está acoplado ao ResponseBody e aos respectivos conversores. Em segundo lugar, aqui, uma vez que, em vez de converter o corpo da resposta, ele é automaticamente convertido em resposta http.

hi.nitish
fonte
2

@Controllerretorna View. @RestControllerretorna ResponseBody.

G.Brown
fonte
2
Você deveria explicar mais. Como isso está respondendo à pergunta?
Yunnosch 16/07/19
@Yunnosch 'view' é o seu front end, como jsp ou html. O corpo da resposta pode ser xml, json, yaml
G.Brown
Por favor edite sua resposta para adicionar informações úteis. No entanto, ainda não entendi como deve responder à pergunta. Você poderia formular uma explicação como "Sim, você pode / Não, não pode, porque ..."?
Yunnosch 16/07/19
1

A anotação @RestController foi introduzida no Spring 4.0 para simplificar a criação de serviços web RESTful. É uma anotação de conveniência que combina @Controller e @ResponseBody - o que elimina a necessidade de anotar todos os métodos de tratamento de solicitações da classe do controlador com a anotação @ResponseBody.

Dwij Sheth
fonte
0
  • @Controller: Esta anotação é apenas uma versão especializada @Componente permite que as classes do controlador sejam detectadas automaticamente com base na varredura do caminho de classe.
  • @RestController: Esta anotação é uma versão especializada, @Controllerque adiciona @Controllere @ResponseBodyanota automaticamente, para que não tenhamos que adicionar @ResponseBodyaos nossos métodos de mapeamento.
Prashant Goswami
fonte
0

O @Controller é usado em sistemas legados que usam JSPs. pode retornar visualizações. @RestController é para marcar que o controlador está fornecendo serviços REST com o tipo de resposta JSON. para agrupar as anotações @Controller e @ResponseBody.

Tharindu Eranga
fonte
-3

@RestControlleré composição de @Controllere @ResponseBody, se não estamos usando a @ResponseBodyassinatura no método, precisamos usar o @Restcontroller.

sambhu
fonte
-3

Em vez de usar o @Controller e o @ResponseBody, o @RestController permite expor as APIs Rest no Spring 4.0 e acima.

CoffeeBeanie
fonte
Você quer dizer que o @RestController também converte a resposta para JSON / XML automaticamente. ? você usou uma frase abstrata em vez de explicá-la claramente, não vou sugerir isso.
cinqS
Pense bem, o @Controller faz o mesmo que ele produz e consome tipos mime JSON / XML ou de outra forma ... @ ResponseBody diz ao Controller para se comportar como o ponto de extremidade REST sem produzir um View. RestController faz isso implicitamente.
CoffeeBeanie 13/03