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 @Controller
e @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 { }
Thymeleaf
ele não funcionará @RestController
devido ao @ResponseBody
que está incluído nesta anotação.
@ResponseBody
faz 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, @RestController
não poderá retornar uma exibição (usando Viewresolver
em Spring / springboot) e sim @ResponseBody
não é necessário neste caso.
Se você usar, @Controller
poderá retornar uma visualização no Spring Web MVC.
@RestController
classes anotadas são as mesmas, @Controller
mas os @ResponseBody
mé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 @Controller
controladores 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.
@RestController
foi introduzido no Spring 4x. Essa anotação também é anotada por si mesma; @Controller
portanto, se não estiver funcionando como um @Controller
relatório, relate isso como um bug.
Interceptor
a um @RestController
.
Interceptor
a 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.
@RestController
foi 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:
@RequestMapping
juntamente com @ResponseBody
como@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.
@Controller
retorna View
. @RestController
retorna 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 @Component
e 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, @Controller
que adiciona @Controller
e @ResponseBody
anota automaticamente, para que não tenhamos que adicionar @ResponseBody
aos 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.