Spring Boot es ideal para desarrollar aplicaciones web. Puede crear un servidor HTTP independiente utilizando Tomcat, Jetty, Undertow o Netty integrados. La mayoría de las aplicaciones web utilizan el módulo spring-boot-starter-web para una ejecución rápida. También puede compilar aplicaciones web reactivas utilizando el módulo spring-boot-starter-webflux.

Si desea crear aplicaciones web basadas en servlets, puede aprovechar la configuración automática de Spring. capacidades Boot para Spring MVC o Jersey.

Spring Web MVC Framework

Spring Web MVC (a menudo denominado "Spring MVC") es un framework web completo basado en el modelo -controlador de vista". Spring MVC le permite crear beans personalizados con anotaciones @Controller o @RestController para manejar las solicitudes HTTP entrantes. Los métodos en el controlador se asignan al protocolo HTTP mediante anotaciones @RequestMapping.

El siguiente código muestra una anotación @RestController típica que funciona con datos JSON. :

Java
importar java.util.List; importar org.springframework.web.bind.annotation.DeleteMapping; importar org.springframework.web.bind.annotation.GetMapping; importar org.springframework.web.bind.annotation.PathVariable; importar org.springframework.web.bind.annotation.RequestMapping; importar org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/users") clase pública MyRestController { UserRepository final privado userRepository; CustomerRepository final privado customerRepository; public MyRestController(UserRepository userRepository, CustomerRepository customerRepository) { this.userRepository = userRepository; this.customerRepository = customerRepository; } @GetMapping("/{userId}") usuario público getUser(@PathVariable Long userId) { return this.userRepository.findById(userId).get(); } @GetMapping("/{userId}/clientes") lista pública<Cliente> getUserCustomers(@PathVariable Long userId) { return this.userRepository.findById(userId).map(this.customerRepository::findByUser).get(); } @DeleteMapping("/{userId}") public void deleteUser(@PathVariable Long userId) { this.userRepository.deleteById(userId); } } 
Kotlin
importar org.springframework.web.bind.annotation.DeleteMapping importar org.springframework.web.bind.annotation.GetMapping importar org.springframework.web.bind.annotation.PathVariable importar org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/users") clase MyRestController(valor privado userRepository: UserRepository, valor privado customerRepository: CustomerRepository ) { @GetMapping("/{userId}") divertido getUser(@PathVariable userId: Long): Usuario { return userRepository.findById(userId).get() } @GetMapping("/{userId}/customers") divertido getUserCustomers (@PathVariable userId: Largo): Lista<Cliente> { return userRepository.findById(userId).map(customerRepository::findByUser).get() } @DeleteMapping("/{userId}") fun deleteUser(@PathVariable userId: Long) { userRepository.deleteById(userId) } } 

"WebMvc.fn", una opción funcional, separa la configuración de enrutamiento del procesamiento real de solicitudes, como se muestra en el siguiente ejemplo :

Java
import org.springframework.context.annotation.Bean; importar org.springframework.context.annotation.Configuration; importar org.springframework.http.MediaType; importar org.springframework.web.servlet.function.RequestPredicate; importar org.springframework.web.servlet.function.RouterFunction; importar org.springframework.web.servlet.function.ServerResponse; importar estática org.springframework.web.servlet.function.RequestPredicates.accept; importar estática org.springframework.web.servlet.function.RouterFunctions.route; @Configuration(proxyBeanMethods = false) clase pública MyRoutingConfiguration { RequestPredicate final estático privado ACCEPT_JSON = aceptar(MediaType.APPLICATION_JSON); @Bean public RouterFunction<ServerResponse> routerFunction(MyUserHandler userHandler) { return ruta() .GET("/{usuario}", ACCEPT_JSON, userHandler::getUser) .GET("/{user}/customers", ACCEPT_JSON, userHandler::getUserCustomers) .DELETE(" /{usuario}", ACCEPT_JSON, userHandler::deleteUser) .build(); } } 
Kotlin
importar org.springframework.context.annotation.Bean importar org.springframework.context.annotation.Configuración importar org.springframework.http.MediaType importar org.springframework.web.servlet.function.RequestPredicates.accept importar org.springframework.web .servlet.function.RouterFunction importar org.springframework.web.servlet.function.RouterFunctions importar org.springframework.web.servlet.function.ServerResponse @Configuration(proxyBeanMethods = false ) clase MyRoutingConfiguration { @Bean fun routerFunction(userHandler: MyUserHandler): RouterFunction<ServerResponse> { return RouterFunctions.route() .GET("/{usuario}", ACCEPT_JSON, userHandler::getUser) .GET("/{user}/customers", ACCEPT_JSON, userHandler::getUserCustomers) .DELETE("/{usuario }", ACCEPT_JSON, userHandler::deleteUser) .build() } objeto complementario { valor privado ACCEPT_JSON = aceptar(MediaType.APPLICATION_JSON) } } 
Java
import org.springframework.stereotype.Component; importar org.springframework.web.servlet.function.ServerRequest; importar org.springframework.web.servlet.function.ServerResponse; @Component public class MyUserHandler { public ServerResponse getUser(ServerRequest request) { ... return ServerResponse.ok().build(); } public ServerResponse getUserCustomers (solicitud de ServerRequest) { ... return ServerResponse.ok().build(); } public ServerResponse deleteUser (solicitud de ServerRequest) { ... return ServerResponse.ok().build(); } } 
Kotlin
importar org.springframework.stereotype.Component importar org.springframework.web.servlet.function.ServerRequest importar org.springframework.web.servlet.function.ServerResponse @Component clase MyUserHandler { fun getUser(solicitud: ServerRequest?): ServerResponse { return ServerResponse.ok().build() } fun getUserCustomers(solicitud: ServerRequest?): ServerResponse { return ServerResponse.ok().build() } fun deleteUser( solicitud: ServerRequest?): ServerResponse { return ServerResponse.ok().build() } } 
Para modular la definición de un enrutador, puede definir tantos beans RouterFunction como desee. Los beans se pueden ordenar si desea aplicar el orden de ejecución.

Configuración automática de Spring MVC

Spring Boot proporciona configuración automática para Spring MVC, que funciona bien con la mayoría de las aplicaciones.

La configuración automática agrega la siguiente funcionalidad además de la configuración predeterminada de Spring:

  • Agregar ContentNegotiatingViewResolver y BeanNameViewResolver beans.

  • Soporte para el procesamiento de recursos estáticos, incluido el soporte para WebJars.

  • Registro automático de Convertidor , GenericConverter beans y Formatter.

  • Soporte para HttpMessageConverters.

  • Registro automático MessageCodesResolver.

  • Soporte para index.html estático.

  • Uso automático del bean ConfigurableWebBindingInitializer.

Si necesita guardar estas configuraciones de Spring Boot MVC y agregue configuraciones MVC adicionales (interceptores, formateadores, controladores de vista y otras funciones), luego puede agregar su propia clase marcada con la anotación @Configuration, como WebMvcConfigurer, pero sin la anotación @EnableWebMvc.

Si necesita pasar instancias personalizadas de RequestMappingHandlerMapping, RequestMappingHandlerAdapter o ExceptionHandlerExceptionResolver y al mismo tiempo preservar la configuración de Spring Boot MVC, luego puede declarar un bean de tipo WebMvcRegistrations y usarlo para pasar instancias personalizadas de estos componentes.

Si necesita controlar completamente el funcionamiento de Spring MVC, puede agregar su propio @Configuration, marcado con @EnableWebMvc. anotación, o puede agregar su propia clase DelegatingWebMvcConfiguration, marcada con la anotación @Configuration, como se describe en el Javadoc para la anotación @ EnableWebMvc.

Spring MVC usa un ConversionService diferente al usado para la conversión de valores desde su aplicación . properties o el archivo application.yaml. Esto significa que los convertidores Period, Duration y DataSize no estarán disponibles y que los convertidores @DurationUnit y @ anotaciones DataSizeUnit serán ignoradas.

Si necesita personalizar la configuración del servicio ConversionService utilizado por Spring MVC, puede proporcionar un WebMvcConfigurer. Bean con un método addFormatters. Desde este método, puede registrar cualquier convertidor preferido o delegar autoridad a métodos estáticos disponibles para ApplicationConversionService.

HttpMessageConverters

Spring MVC usa el Interfaz >HttpMessageConverter para convertir solicitudes y respuestas HTTP. Se proporcionan configuraciones predeterminadas adecuadas listas para usar. Por ejemplo, los objetos se pueden convertir automáticamente a JSON (usando la biblioteca Jackson) o a XML (usando la extensión Jackson XML si está disponible, o usando JAXB si la extensión Jackson XML no está disponible). De forma predeterminada, las cadenas están codificadas en UTF-8.

Si necesita agregar o personalizar convertidores, puede usar la clase HttpMessageConverters para Spring Boot , como se muestra en el siguiente listado:

Java
importar org.springframework.boot.autoconfigure .http.HttpMessageConverters; importar org.springframework.context.annotation.Bean; importar org.springframework.context.annotation.Configuration; importar org.springframework.http.converter.HttpMessageConverter; @Configuration(proxyBeanMethods = false) clase pública MyHttpMessageConvertersConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> adicional = nuevo AdditionalHttpMessageConverter(); HttpMessageConverter<?> otro = nuevo OtroHttpMessageConverter(); devolver nuevos HttpMessageConverters (adicional, otro); } } 
Kotlin
importar org.springframework.boot.autoconfigure.http.HttpMessageConverters importar org.springframework.context.annotation.Bean importar org.springframework.context.annotation.Configuration importar org.springframework.http.converter.HttpMessageConverter @Configuration(proxyBeanMethods = false) class MyHttpMessageConvertersConfiguration { @Bean fun customConverters(): HttpMessageConverters { val adicional: HttpMessageConverter<*> = AdditionalHttpMessageConverter() val otro: HttpMessageConverter<*> = AnotherHttpMessageConverter() devuelve HttpMessageConverters(adicional, otro) } } 

Cualquier bean HttpMessageConverter presente en el contexto , se agrega a la lista de convertidores. Puede anular los solucionadores predeterminados de la misma manera.

MessageCodesResolver

Spring MVC contiene una estrategia de generación de código de error para imprimir mensajes de error vinculantes: MessageCodesResolver. la propiedad está establecida spring.mvc.message-codes-resolver-format PREFIX_ERROR_CODE o POSTFIX_ERROR_CODE, Spring Boot la creará por usted.