El tipo WebMvcConfigurerAdapter está en desuso


116

Acabo de migrar a la versión Spring MVC 5.0.1.RELEASEpero de repente en eclipse STS WebMvcConfigurerAdapter está marcado como obsoleto

public class MvcConfig extends WebMvcConfigurerAdapter {
  @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        // to serve static .html pages...
        registry.addResourceHandler("/static/**").addResourceLocations("/resources/static/");
    }
  ....
  }

¿Cómo puedo eliminar esto?

Respuestas:


227

Desde Spring 5 solo necesita implementar la interfaz WebMvcConfigurer:

public class MvcConfig implements WebMvcConfigurer {

Esto se debe a que Java 8 introdujo métodos predeterminados en interfaces que cubren la funcionalidad de la WebMvcConfigurerAdapterclase.

Mira aquí:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html


1
¿Y si tuviera super.configureMessageConverters(converters)cómo puedo traducir este código ahora? Ahora no hay nada superal que referirse.
tryHard

1
@yami Simplemente llame a configureMessageConverters (convertidores), esto ejecutará el método predeterminado definido en la interfaz
Plog

@Plog, @Yami: Hacer lo sugerido produce un java.lang.StackOverflowError, porque omitir el .superinicia un ciclo de llamada recursivo e interminable.
ThirstForKnowledge

2
Al agregar convertidores a la lista, se desactiva el registro del convertidor predeterminado. Al llamar primero a super.configureMessageConverters (convertidores) probablemente desee mantener el convertidor predeterminado. Para simplemente agregar un convertidor sin afectar el registro predeterminado, considere usar el método extendMessageConverters(java.util.List)( docs.spring.io/spring/docs/current/javadoc-api/org/… ) en su lugar.
ThirstForKnowledge

1
@ThirstForKnowledge Oh, esta es mi culpa. La forma en que debe llamar a un método súper predeterminado en una interfaz es: WebMvcConfigurer.super.configureMessageConverters (convertidores)
Plog

7

He estado trabajando en la biblioteca de documentación equivalente de Swagger llamada Springfoxhoy en día y descubrí que en Spring 5.0.8 (que se ejecuta actualmente), la interfaz WebMvcConfigurerha sido implementada por clase de WebMvcConfigurationSupportclase que podemos extender directamente.

import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

public class WebConfig extends WebMvcConfigurationSupport { }

Y así es como lo he usado para configurar mi mecanismo de manejo de recursos de la siguiente manera:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("swagger-ui.html")
            .addResourceLocations("classpath:/META-INF/resources/");

    registry.addResourceHandler("/webjars/**")
            .addResourceLocations("classpath:/META-INF/resources/webjars/");
}

1

Utilizar org.springframework.web.servlet.config.annotation.WebMvcConfigurer

Con Spring Boot 2.1.4.RELEASE (Spring Framework 5.1.6.RELEASE), haga esto

package vn.bkit;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; // Deprecated.
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
public class MvcConfiguration implements WebMvcConfigurer {

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".html");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

}

0

En Spring, todas las solicitudes pasarán por DispatcherServlet . Para evitar la solicitud de archivos estáticos a través de DispatcherServlet (controlador frontal), configuramos el contenido estático de MVC .

Primavera 3.1. introdujo ResourceHandlerRegistry para configurar ResourceHttpRequestHandlers para el servicio de recursos estáticos desde classpath, WAR o el sistema de archivos. Podemos configurar ResourceHandlerRegistry programáticamente dentro de nuestra clase de configuración de contexto web.

  • hemos agregado el /js/**patrón al ResourceHandler, vamos a incluir el foo.jsrecurso ubicado en el webapp/js/directorio
  • hemos agregado el /resources/static/**patrón al ResourceHandler, vamos a incluir el foo.htmlrecurso ubicado en el webapp/resources/directorio
@Configuration
@EnableWebMvc
public class StaticResourceConfiguration implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        System.out.println("WebMvcConfigurer - addResourceHandlers() function get loaded...");
        registry.addResourceHandler("/resources/static/**")
                .addResourceLocations("/resources/");

        registry
            .addResourceHandler("/js/**")
            .addResourceLocations("/js/")
            .setCachePeriod(3600)
            .resourceChain(true)
            .addResolver(new GzipResourceResolver())
            .addResolver(new PathResourceResolver());
    }
}

Configuración XML

<mvc:annotation-driven />
  <mvc:resources mapping="/staticFiles/path/**" location="/staticFilesFolder/js/"
                 cache-period="60"/>

Spring Boot MVC Static Content si el archivo se encuentra en la carpeta de recursos / aplicaciones web de WAR .

spring.mvc.static-path-pattern=/resources/static/**
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.