Java MVC Configuration y MVC XML Namespace proporcionan una configuración predeterminada adecuada para la mayoría de las aplicaciones y una API de configuración para personalizarla.
No es necesario comprender los beans subyacentes producidos por MVC Java Configuration y el espacio de nombres MVC.
Activación de una configuración MVC
En una configuración Java, puede utilizar la anotación @EnableWebMvc
para habilitar una configuración MVC, como se muestra en el siguiente ejemplo:
@Configuration
@EnableWebMvc
public class WebConfig {
}
@Configuration
@EnableWebMvc
class WebConfig
En la configuración XML, puede utilizar el <mvc:annotation-driven>
elemento para activar la configuración MVC, como se muestra en el siguiente ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven/>
</beans>
El siguiente ejemplo registra una cantidad de beans de infraestructura Spring MVC y se adapta a las dependencias disponibles en el classpath (por ejemplo, convertidores de carga útil para JSON, XML, etc.).
API de configuración MVC
En la configuración de Java, puede implementar la interfaz WebMvcConfigurer
, como se muestra en el siguiente ejemplo. :
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// Implementar métodos de configuración...
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
// Implement configuration methods...
}
En XML, puede validar atributos y subelementos <mvc:annotation-driven/>
. Puede ver el esquema XML de Spring MVC o utilizar la función de finalización de código en su IDE. para saber qué atributos y subelementos están disponibles.
Conversión de tipos
De forma predeterminada, los formateadores se instalan para varios tipos de números y fechas, junto con soporte de personalización a través de @NumberFormat
y @DateTimeFormat
para los campos.
Para registrar formateadores y convertidores personalizados en la configuración de Java, utilice lo siguiente:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// ...
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
// ...
}
}
Para hacer lo mismo en la configuración XML, use lo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="org.example.MyConverter"/>
</set>
</property>
<property name="formatters">
<set>
<bean class="org.example.MyFormatter"/>
<bean class="org.example.MyAnnotationFormatterFactory"/>
</set>
</property>
<property name="formatterRegistrars">
<set>
<bean class="org.example.MyFormatterRegistrar"/>
</set>
</property>
</bean>
</beans>
De forma predeterminada, Spring MVC respeta la configuración regional de la solicitud al analizar y formatear valores de fecha. Esto es cierto para formularios donde las fechas se representan como cadenas con campos de formulario de "entrada". Sin embargo, para los campos de formulario "fecha" y "hora", los navegadores utilizan un formato fijo definido en la especificación HTML. Para tales casos, el formato de fecha y hora se puede configurar de la siguiente manera:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
val registrar = DateTimeFormatterRegistrar()
registrar.setUseIsoFormat(true)
registrar.registerFormatters(registry)
}
}
Validación
Predeterminado, si un Bean de validación está presente en el classpath (por ejemplo, Hibernate Validator), el LocalValidatorFactoryBean
se registra como un validador global para su uso con la anotación @Valid
y el Propiedad Validated
en argumentos para métodos de controlador.
En su configuración de Java, puede configurar una instancia global de Validator
, como se muestra en el siguiente ejemplo:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public Validator getValidator() {
// ...
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun getValidator(): Validator {
// ...
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven validator="globalValidator"/>
</beans>
Tenga en cuenta que también es posible registrar implementaciones de Validator
localmente, como se muestra en el siguiente ejemplo:
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
@Controller
class MyController {
@InitBinder
protected fun initBinder(binder: WebDataBinder) {
binder.addValidators(FooValidator())
}
}
LocalValidatorFactoryBean
se inyectó en algún lugar, cree un bean y márquelo con la anotación
@Primary
para evitar conflictos con lo que se declaró en la configuración de MVC.
Interceptores
En su configuración de Java, puede registrar interceptores para aplicarlos a las solicitudes entrantes, como se muestra en el siguiente ejemplo:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addInterceptors(registry: InterceptorRegistry) {
registry.addInterceptor(LocaleChangeInterceptor())
registry.addInterceptor(ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**")
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/admin/**"/>
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
Tipos de contenido
El método se puede configurar. Spring MVC define los tipos de medios solicitados a partir de la solicitud (como el encabezado Aceptar
, la extensión de la ruta URL, el parámetro de solicitud y otros).
De forma predeterminada, solo se muestra el encabezado marque Aceptar
.
Si necesita utilizar una resolución de tipo de contenido basada en URL, considere usar una estrategia de parámetros de solicitud en lugar de extensiones de ruta.
En Java configuración, puede configurar la resolución del tipo de contenido solicitado, como se muestra en el siguiente ejemplo:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.mediaType("json", MediaType.APPLICATION_JSON);
configurer.mediaType("xml", MediaType.APPLICATION_XML);
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) {
configurer.mediaType("json", MediaType.APPLICATION_JSON)
configurer.mediaType("xml", MediaType.APPLICATION_XML)
}
}
El siguiente ejemplo muestra, cómo obtener la misma configuración en XML:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
</value>
</property>
</bean>
Convertidores de mensajes
Puedes configurar HttpMessageConverter
en tu configuración de Java anulando configureMessageConverters()
(para reemplazar los convertidores predeterminados creados por Spring MVC) o anulando extendMessageConverters()
(para personalizar los convertidores predeterminados o agregar convertidores adicionales a los convertidores predeterminados).
El siguiente ejemplo agrega convertidores XML y Jackson JSON con configurado ObjectMapper
en lugar de los estándar:
@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.indentOutput(true)
.dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
.modulesToInstall(new ParameterNamesModule());
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
}
}
@Configuration
@EnableWebMvc
class WebConfiguration : WebMvcConfigurer {
override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
val builder = Jackson2ObjectMapperBuilder()
.indentOutput(true)
.dateFormat(SimpleDateFormat("yyyy-MM-dd"))
.modulesToInstall(ParameterNamesModule())
converters.add(MappingJackson2HttpMessageConverter(builder.build()))
converters.add(MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()))
En el ejemplo anterior Jackson2ObjectMapperBuilder
se utiliza para crear una configuración común para MappingJackson2HttpMessageConverter
y MappingJackson2XmlHttpMessageConverter
con sangría habilitada, formato de fecha configurado y registro de módulo jackson-module-parameter-names
que agrega soporte para acceder a nombres de parámetros (una característica agregado en Java 8).
Esta herramienta de compilación configura las propiedades predeterminadas de Jackson de la siguiente manera:
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
está deshabilitado.MapperFeature.DEFAULT_VIEW_INCLUSION
está deshabilitado.
También registra automáticamente los siguientes módulos conocidos si se encuentran en el classpath:
jackson-datatype-joda: Soporte para tipos Joda Time.
jackson-datatype -jsr310: Compatibilidad con tipos de API de fecha y hora de Java 8.
jackson-datatype-jdk8: admite otros tipos de Java 8, como
Opcional
.jackson-module-kotlin
: soporte para clases de Kotlin y clases de datos.
woodstox-core-asl
además de
jackson-dataformat-xml
.
Hay otros módulos interesantes de Jackson:
jackson-datatype-money: Soporte para tipos
javax.money
(módulo no oficial).jackson-datatype-hibernate: compatibilidad con tipos y propiedades específicos de Hibernate (incluidos aspectos de carga diferida).
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper"/>
</bean>
<bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
<property name="objectMapper" ref="xmlMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
p:indentOutput="true"
p:simpleDateFormat="yyyy-MM-dd"
p:modulesToInstall="com.fasterxml.jackson.module.paramnames.ParameterNamesModule"/>
<bean id="xmlMapper" parent="objectMapper" p:createXmlMapper="true"/>
Vista del controlador
Esta es una abreviatura para definir un ParameterizableViewController
que, cuando se llama, salta inmediatamente a la vista. Puede usarlo en casos estáticos donde no hay ninguna lógica de controlador Java que deba ejecutarse antes de que la vista genere una respuesta.
El siguiente ejemplo de configuración de Java realiza una solicitud a /
en vista llamada home
:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addViewControllers(registry: ViewControllerRegistry) {
registry.addViewController("/").setViewName("home")
}
}
El siguiente ejemplo produce lo mismo que el anterior, pero usando XML, usando el elemento <mvc:view-controller>
:
<mvc:view-controller path="/" view-name="home"/>
Si un método con la anotación @RequestMapping
se asigna a una URL para cualquier método HTTP, entonces el controlador de vista no se puede utilizar para procesar la misma URL. Esto se debe a que una coincidencia de URL con un controlador anotado se considera una indicación lo suficientemente fuerte de la propiedad del punto final como para que se pueda enviar una respuesta 405 (METHOD_NOT_ALLOWED), 415 (UNSUPPORTED_MEDIA_TYPE) o similar al cliente para ayudar en la depuración. Por este motivo, se recomienda evitar dividir el procesamiento de URL en un controlador anotado y un controlador de vista.
Resolvedores de vistas
La configuración de MVC facilita el registro de solucionadores de vistas.
En el siguiente ejemplo, la configuración de Java configura la resolución de vista de negociación de contenido usando JSP y Jackson como View
predeterminado para renderizar en formato JSON:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(new MappingJackson2JsonView());
registry.jsp();
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.enableContentNegotiation(MappingJackson2JsonView())
registry.jsp()
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:view-resolvers>
<mvc:content-negotiation>
<mvc:default-views>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
</mvc:default-views>
</mvc:content-negotiation>
<mvc:jsp/>
</mvc:view-resolvers>
Sin embargo, tenga en cuenta que FreeMarker, Tiles, Groovy Markup y las plantillas de secuencias de comandos también requieren configuración de la tecnología de presentación.
El espacio de nombres MVC proporciona elementos especiales. El siguiente ejemplo funciona con FreeMarker:
<mvc:view-resolvers>
<mvc:content-negotiation>
<mvc:default-views>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
</mvc:default-views>
</mvc:content-negotiation>
<mvc:freemarker cache="false"/>
</mvc:view-resolvers>
<mvc:freemarker-configurer>
<mvc:template-loader-path location="/freemarker"/>
</mvc:freemarker-configurer>
En la configuración de Java, puede agregar el bean Configurer
correspondiente, como se muestra en el siguiente ejemplo:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(new MappingJackson2JsonView());
registry.freeMarker().cache(false);
}
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/freemarker");
return configurer;
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.enableContentNegotiation(MappingJackson2JsonView())
registry.freeMarker().cache(false)
}
@Bean
fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
setTemplateLoaderPath("/freemarker")
}
}
Recursos estáticos
Esta opción proporciona una manera conveniente de manejar recursos estáticos desde una lista de ubicaciones basadas en Recurso
.
En el siguiente ejemplo, si la solicitud comienza con /resources
, la ruta relativa se utiliza para buscar y procesar recursos estáticos relativos a /public
en la aplicación web. Root o en el classpath en /static
. Los recursos se proporcionan con una fecha de vencimiento de un año para garantizar el uso máximo de la caché del navegador y una reducción en las solicitudes HTTP realizadas por el navegador. La información Last-Modified
se deriva de Recurso#lastModified
para proporcionar soporte para solicitudes HTTP condicionales con encabezados "Last-Modified"
.
La siguiente lista muestra cómo hacer esto usando la configuración de Java:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)))
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:resources mapping="/resources/**"
location="/public, classpath:/static/"
cache-period="31556926" />
El controlador de recursos también admite el encadenamiento de implementaciones ResourceResolver
y ResourceTransformer
que puede utilizar para crear un conjunto de herramientas para trabajar con recursos optimizados.
Puede utilizar VersionResourceResolver
para versionar las URL de recursos de versión basándose en un hash MD5, calculado a partir del contenido, versión fija de la aplicación u otro. ContentVersionStrategy
(hash MD5) es una elección inteligente, con algunas excepciones notables, como los recursos de JavaScript utilizados con el cargador de módulos.
El siguiente ejemplo muestra cómo utilizar VersionResourceResolver
en la configuración de Java:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(VersionResourceResolver().addContentVersionStrategy("/**"))
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:resources mapping="/resources/**" location="/public/">
<mvc:resource-chain resource-cache="true">
<mvc:resolvers>
<mvc:version-resolver>
<mvc:content-version-strategy patterns="/**"/>
</mvc:version-resolver>
</mvc:resolvers>
</mvc:resource-chain>
</mvc:resources>
Luego puede utilizar ResourceUrlProvider
para reescribir las URL y aplicar la cadena completa de solucionadores y solucionadores, por ejemplo, para insertar versiones. La configuración de MVC proporciona un bean ResourceUrlProvider
que se puede inyectar en otros beans. También puede hacer que la reescritura sea transparente usando ResourceUrlEncodingFilter
para Thymeleaf, JSP, FreeMarker y otros usando etiquetas URL que dependen de HttpServletResponse#encodeURL
.
Tenga en cuenta que cuando usando EncodedResourceResolver
(por ejemplo, para procesar recursos codificados con métodos de compresión gzip o brotli) y VersionResourceResolver
, debe registrarlos en ese orden. Esto permite calcular de forma fiable las versiones basadas en contenido a partir del archivo sin formato.
WebJars También son compatibles con WebJarsResourceResolver
, que se registra automáticamente cuando la biblioteca org.webjars:webjars-locator-core
está presente en el classpath. El solucionador puede reescribir las URL para incluir la versión jar y también puede hacer coincidir las URL entrantes sin versiones, por ejemplo, desde /jquery/jquery.min.js
hasta /jquery/1.2.0/jquery.min.js
.
ResourceHandlerRegistry
proporciona capacidades adicionales para un control detallado, como la lógica de último cambio y la resolución optimizada de recursos.
Servlet predeterminado
El marco Spring MVC le permite asignar DispatcherServlet
a /
(anulando así la representación del servlet contenedor estándar), con las solicitudes estáticas de recursos siendo manejadas por el servlet contenedor estándar. Configura DefaultServletHttpRequestHandler
con la asignación de URL /**
y la prioridad más baja en relación con otras asignaciones de URL.
Este controlador reenvía todas las solicitudes al servlet predeterminado. Por lo tanto, debe permanecer al final en el orden de todos los demás HandlerMappings
para la URL. Esto ocurre cuando se utiliza <mvc:annotation-driven>
. Además, si crea su propia instancia HandlerMapping
, asegúrese de establecer su propiedad order
en un valor menor que DefaultServletHttpRequestHandler
, que es Integer.MAX_VALUE
.
El siguiente ejemplo muestra cómo habilitar esta característica usando la configuración predeterminada:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
configurer.enable()
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:default-servlet-handler/>
La advertencia para anular la asignación de servlet /
es que el RequestDispatcher
para el servlet predeterminado debe encontrarse mediante nombre, y no en el camino. DefaultServletHttpRequestHandler
intenta determinar automáticamente el servlet predeterminado para un contenedor en el momento del inicio, utilizando una lista de nombres conocidos para la mayoría de los principales contenedores de servlets (incluidos Tomcat, Jetty, GlassFish, JBoss, Resin, WebLogic y WebSphere). Si el servlet predeterminado se ha configurado de forma personalizada con un nombre diferente, o si está utilizando un contenedor de servlet diferente donde se desconoce el nombre del servlet predeterminado, debe especificar explícitamente el nombre del servlet predeterminado, como se muestra en el siguiente ejemplo:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable("myCustomDefaultServlet");
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
configurer.enable("myCustomDefaultServlet")
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>
Asignación de rutas
Puede configurar ajustes relacionados con la asignación de rutas y el manejo de URL. Para obtener más información sobre opciones individuales, consulte el javadoc en PathMatchConfigurer
.
El siguiente ejemplo muestra cómo configurar la coincidencia de rutas en una configuración de Java:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer
.setPatternParser(new PathPatternParser())
.addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController.class));
}
private PathPatternParser patternParser() {
// ...
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun configurePathMatch(configurer: PathMatchConfigurer) {
configurer
.setPatternParser(patternParser)
.addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController::class.java))
}
fun patternParser(): PathPatternParser {
//...
}
}
El siguiente ejemplo muestra cómo obtener la misma configuración en XML:
<mvc:annotation-driven>
<mvc:path-matching
trailing-slash="false"
path-helper="pathHelper"
path-matcher="pathMatcher"/>
</mvc:annotation-driven>
<bean id="pathHelper" class="org.example.app.MyPathHelper"/>
<bean id="pathMatcher" class="org.example.app.MyPathMatcher"/>
Configuración avanzada de Java
@EnableWebMvc
importa DelegatingWebMvcConfiguration
, que:
Pasa la configuración Spring predeterminada para aplicaciones Spring MVC
Descubre y delega implementaciones de
WebMvcConfigurer
para configurar esta configuración.
En modo avanzado, puede eliminar el annotation @EnableWebMvc
y realice la extensión directamente desde DelegatingWebMvcConfiguration
en lugar de implementar WebMvcConfigurer
, como se muestra en el siguiente ejemplo:
@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {
// ...
}
@Configuration
class WebConfig : DelegatingWebMvcConfiguration() {
// ...
}
Puedes guardar los métodos existentes en WebConfig
, pero ahora también es posible anular las declaraciones de beans de la clase base, y aún es posible tener cualquier número de otras implementaciones de WebMvcConfigurer
en el classpath.
Configuración XML extendida
Los nombres de Space MVC no proporcionan un modo extendido. Si necesita establecer una propiedad de bean que no se puede cambiar de ninguna otra manera, puede usar el ciclo de vida BeanPostProcessor
interceptor en ApplicationContext
para Spring, como se muestra en el siguiente ejemplo:
@Component
public class MyPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
// ...
} puede utilizar
}
@Component
class MyPostProcessor : BeanPostProcessor {
override fun postProcessBeforeInitialization(bean: Any, name: String): Any {
// ...
}
}
GO TO FULL VERSION