Respostas:
@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 { }
Thymeleafele não funcionará @RestControllerdevido ao @ResponseBodyque está incluído nesta anotação.
@ResponseBodyfaz com que os objetos retornados para algo que poderia ser no corpo, por exemplo, JSON ou XML ( fonte )
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.
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.
@RestControllerclasses anotadas são as mesmas, @Controllermas os @ResponseBodymétodos manipuladores estão implícitos.
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.
@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.
Interceptora um @RestController.
Interceptora um @RestController.
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.
@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:
@RequestMappingjuntamente com @ResponseBodycomo@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/> pode ser usado como uma das maneiras de usar JSON com Jackson ou xml.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@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.
@Controllerretorna View. @RestControllerretorna ResponseBody.
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.
@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.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.
Em vez de usar o @Controller e o @ResponseBody, o @RestController permite expor as APIs Rest no Spring 4.0 e acima.