java - responsebody - Diferencia entre la primavera @Controller y @RestController anotación
restcontroller spring example (12)
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 el código de abajo 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 @ResponseBody
está activado de forma predeterminada. No es necesario agregarlo por encima de la firma de función.
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.
LA nueva anotación @RestController en Spring4 +, que marca a la clase como un controlador donde cada método devuelve un objeto de dominio en lugar de una vista. Es una taquigrafía para @Controller y @ResponseBody rodados juntos.
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
es una composición de @Controller
y @ResponseBody
, si no estamos usando @ResponseBody
en la firma del Método, entonces necesitamos usar @Restcontroller
.
@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:
@RequestMapping
junto con@ResponseBody
como@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }
<mvc:annotation-driven/>
puede usarse como una de las formas de usar JSON con Jackson o xml.- MyBean se puede definir como
@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }
-
@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.
-
@Controller
se utiliza para marcar clases como Spring MVC Controller. -
@RestController
es una anotación de conveniencia que no hace nada más que agregar las anotaciones@Controller
y@ResponseBody
(ver: Javadoc )
Así que las siguientes dos definiciones de controlador deberían hacer lo mismo
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }