Diferencia entre la anotación spring @Controller y @RestController

357

Diferencia entre primavera @Controllery @RestControlleranotación.

¿Se @Controllerpuede usar la anotación para aplicaciones Web MVC y REST?
En caso afirmativo, ¿cómo podemos diferenciar si se trata de la aplicación Web MVC o REST?

Srikanth
fuente

Respuestas:

471
  • @Controller se usa para marcar clases como Spring MVC Controller.
  • @RestControlleres una anotación de conveniencia que no hace más que agregar las anotaciones @Controllery @ResponseBody(ver: Javadoc )

Entonces, las siguientes dos definiciones de controlador deberían hacer lo mismo

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
micha
fuente
48
Creo que @RestController también convierte la respuesta a JSON / XML automáticamente.
arnabkaycee
1
Simplemente compartiendo un enlace a un tutorial de Spring que explica la diferencia spring.io/guides/gs/rest-service
Mina Samy
99
Además, si usa el motor de plantillas Thymeleaf, no funcionará @RestControllerdebido a lo @ResponseBodyque se incluye en esta anotación.
Sonique
3
@ResponseBodyconvierte los objetos devueltos en algo que podría estar en el cuerpo, por ejemplo, JSON o XML ( fuente )
Martin Thoma
59

En el siguiente código te mostraré la diferencia entre @controller

@Controller
public class RestClassName{

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

y @RestController

@RestController
public class RestClassName{

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

el @ResponseBodyestá activado por defecto. No necesita agregarlo sobre la firma de la función.

BERGUIGA Mohamed Amine
fuente
1
Los nombres de clase en Java deben comenzar con mayúscula, es decir, RestClassName (no restClassName).
Razzle
24

Si lo usa, @RestControllerno puede devolver una vista (Al usar Viewresolveren Spring / springboot) y sí @ResponseBodyno es necesario en este caso.

Si lo usa @Controller, puede devolver una vista en Spring web MVC.

Ravi Wadje
fuente
Sí, @ResponseBody se puede poner en un método e indica que el tipo de retorno debe escribirse directamente en el cuerpo de respuesta HTTP (y no colocarse en un Modelo, o interpretarse como un nombre de vista)
PraveenKumar Lalasangi
14

En realidad, tenga cuidado: no son exactamente lo mismo.

Si define algún interceptor dentro de su aplicación, no se aplicará a los Controladores anotados como @RestController, sin embargo, funcionan con @Controllercontroladores anotados.

es decir. configuración para el interceptor:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


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

}

y en la declaración de un controlador Spring:

@Controller
public class AdminServiceController {...

Sin embargo, funcionará

@RestController
public class AdminServiceController {...

no termina teniendo asociado el interceptor.

bertybro
fuente
2
@RestControllerfue introducido en Spring 4x. Esta anotación también se anota por sí misma, por @Controllerlo que si no funciona como un @Controllerinforme, informe esto como un error.
gaoagong
@bertybro, eso no está del todo bien. Puede asociar una Interceptora una @RestController.
Ravi-A-Doer
Ciertamente he adjuntado con éxito una Interceptora @RestController.
Ben Barden
11

Como puede ver en la documentación de Spring (Documentación de Spring RestController ), la anotación de Rest Controller es la misma que la anotación de Controller, pero suponiendo que @ResponseBody esté activo de forma predeterminada, por lo que todos los json se analizan en objetos java.

CAAY
fuente
4

LA nueva anotación @RestController en Spring4 +, que marca la clase como un controlador donde cada método devuelve un objeto de dominio en lugar de una vista. Es la abreviatura de @Controller y @ResponseBody juntos.

Yancy
fuente
3

@RestControllerfue proporcionado desde la primavera 4.0.1. Estos controladores indican que aquí los métodos @RequestMapping asumen la semántica @ResponseBody por defecto.

En versiones anteriores, se podía lograr una funcionalidad similar usando a continuación:

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

  2. <mvc:annotation-driven/> puede usarse como una de las formas de usar JSON con Jackson o xml.

  3. MyBean se puede definir como

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

  1. @ResponseBody se trata como la vista aquí entre MVC y se envía directamente en lugar de ser enviado desde Dispatcher Servlet y los convertidores respectivos convierten la respuesta en el formato relacionado como texto / html, aplicación / xml, aplicación / json.

Sin embargo, el Restcontroller ya está acoplado con ResponseBody y los respectivos convertidores. En segundo lugar, aquí, ya que en lugar de convertir el cuerpo de respuesta, se convierte automáticamente en respuesta http.

hola.nitish
fuente
2

@Controllervuelve View. @RestControllervuelve ResponseBody.

G.Brown
fuente
2
Deberías explicar más. ¿Cómo responde esto a la pregunta?
Yunnosch
@Yunnosch 'view' es su interfaz como jsp o html. ResponseBody puede ser xml, json, yaml
G.Brown
Por favor, editar su respuesta a añadir información útil. Sin embargo, todavía no entiendo cómo debería responder la pregunta. ¿Podría formular una explicación como "Sí puedes / No no puedes, porque ..."?
Yunnosch
1

La anotación @RestController se introdujo en Spring 4.0 para simplificar la creación de servicios web RESTful. Es una anotación de conveniencia que combina @Controller y @ResponseBody, lo que elimina la necesidad de anotar todos los métodos de manejo de solicitudes de la clase de controlador con la anotación @ResponseBody.

Dwij Sheth
fuente
0
  • @Controller: Esta anotación es solo una versión especializada @Componenty permite que las clases de controlador se detecten automáticamente en función del escaneo de classpath.
  • @RestController: Esta anotación es una versión especializada de la @Controllercual agrega @Controllery @ResponseBodyanota automáticamente, por lo que no tenemos que agregar @ResponseBodya nuestros métodos de mapeo.
Prashant Goswami
fuente
0

@Controller se usa en sistemas heredados que usan JSP. Puede devolver vistas. @RestController es para marcar que el controlador está proporcionando servicios REST con el tipo de respuesta JSON. entonces envuelve las anotaciones @Controller y @ResponseBody juntas.

Tharindu Eranga
fuente
-3

@RestControlleres la composición de @Controllery @ResponseBody, si no estamos usando la @ResponseBodyfirma in Method, entonces necesitamos usar el @Restcontroller.

sambhu
fuente
-3

En lugar de utilizar @Controller y @ResponseBody, @RestController le permite exponer Rest APIs en Spring 4.0 y superior.

Gorro De Café
fuente
Quiere decir que creo que @RestController también convierte la respuesta a JSON / XML automáticamente. ? usaste una oración abstracta en lugar de explicarla claramente, no te lo sugeriré.
cinqS
Ahora que lo pienso, @Controller hace lo mismo, ya que produce y consume los tipos MIME JSON / XML o de otro modo ... @ ResponseBody le dice al Controlador que se comporte como un punto final REST sin producir una Vista. RestController lo hace implícitamente.
CoffeeBeanie