java - restcontroller - spring rest




Diferencia entre la primavera @Controller y @RestController anotación (8)

Diferencia entre la primavera @Controller y @RestController anotación.

¿ @Controller puede @Controller anotación @Controller para aplicaciones tanto Web MVC como REST?
En caso afirmativo, ¿cómo podemos diferenciar si se trata de la aplicación Web MVC o REST?


@Controller se utiliza para los controladores Spring tradicionales y ha sido parte del marco durante mucho tiempo.

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, que elimina la necesidad de anotar todos los métodos de manejo de solicitudes de la clase del controlador con la anotación @ResponseBody.

Los controladores Spring MVC @Controller Classic pueden anotarse con la anotación @Controller. Esto es simplemente una especialización de la clase @Component y permite que las clases de implementación se detecten automáticamente a través del escaneo de classpath.

Por lo general, @Controller se usa en combinación con una anotación @RequestMapping utilizada en los métodos de manejo de solicitudes.

Ejemplo:

@Controller
@RequestMapping("books")
public class SimpleBookController
{
@GetMapping("/{id}", produces = "application/json")
public @ResponseBody Book getBook(@PathVariable int id)
{
    return findBookById(id);
}
}

El método de gestión de solicitudes se anota con @ResponseBody. Esta anotación permite la serialización automática del objeto de retorno en el HttpResponse.

Spring MVC @RestController @RestController es una versión especializada del controlador. Incluye las anotaciones @Controller y @ResponseBody y, como resultado, simplifica la implementación del controlador:

@RestController
@RequestMapping("books-rest")
public class SimpleBookRestController 
{

@GetMapping("/{id}", produces = "application/json")
public Book getBook(@PathVariable int id) {
        return findBookById(id);
    }
}

El controlador está anotado con la anotación @RestController, por lo tanto, no se requiere @ResponseBody.


Como puede ver en la documentación de Spring ( Javadoc ), la anotación del resto del controlador es la misma que la anotación del controlador, pero suponiendo que @ResponseBody está activo de forma predeterminada, por lo que todos los json se analizan en los objetos java.


En lugar de usar @Controller y @ResponseBody, @RestController te permite exponer las API Rest en Spring 4.0 y superior.


En realidad, ten cuidado, no son exactamente lo mismo.

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

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 {...

Funcionará, sin embargo

@RestController
public class AdminServiceController {...

No termina teniendo el interceptor asociado.


Si usa @RestController, no puede devolver una vista (Al usar Viewresolver en Spring / springboot) y sí, no es necesario @ResponseBody en este caso.

Si usa @controller puede devolver una vista en Spring webMVC.


@RestController clases anotadas de @RestController son las mismas que las de @Controller pero están implícitos los métodos @ResponseBody en el controlador.


@RestController se proporcionó desde la primavera 4.0.1. Estos controladores indican que aquí los métodos de @RequestMapping asumen la semántica de @ResponseBody de forma predeterminada.

En versiones anteriores, la funcionalidad similar podría lograrse utilizando a continuación:

  1. @RequestMapping junto con @ResponseBody como @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 despacharse desde Dispatcher Servlet y los convertidores respectivos convierten la respuesta en el formato relacionado como text / html, application / xml, application / json.

Sin embargo, 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.


  • @Controller : esta anotación es solo una versión especializada de @Component y permite que las clases del controlador se detecten automáticamente según el escaneo de classpath.
  • @RestController : esta anotación es una versión especializada de @Controller que agrega automáticamente la anotación @Controller y @ResponseBody para que no tengamos que agregar @ResponseBody a nuestros métodos de mapeo.




spring-mvc