java @responsebody - Diferencia entre la primavera @Controller y @RestController anotación




ejemplo spring (11)

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.

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?


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


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.


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.


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


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


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


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.


  • @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 { }

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.


Los modificadores de acceso están ahí para restringir el acceso en varios niveles.

Público: es básicamente tan simple como puede acceder desde cualquier clase, ya sea que esté en el mismo paquete o no.

Para acceder si está en el mismo paquete, puede acceder directamente, pero si está en otro paquete, puede crear un objeto de la clase.

Predeterminado: Es accesible en el mismo paquete desde cualquiera de la clase de paquete.

Para acceder puedes crear un objeto de la clase. Pero no puede acceder a esta variable fuera del paquete.

Protegido: puede acceder a las variables en el mismo paquete así como a la subclase en cualquier otro paquete. así que básicamente es el comportamiento predeterminado + heredado .

Para acceder al campo protegido definido en la clase base, puede crear el objeto de la clase secundaria.

Privado: se puede acceder en la misma clase.

En los métodos no estáticos, puede acceder directamente debido a esta referencia (también en los constructores), pero para acceder a los métodos estáticos debe crear el objeto de la clase.





java spring spring-mvc