Il tipo WebMvcConfigurerAdapter è deprecato


116

Ho appena migrato alla versione Spring mvc 5.0.1.RELEASEma improvvisamente in eclipse STS WebMvcConfigurerAdapter è contrassegnato come deprecato

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/");
    }
  ....
  }

Come posso rimuoverlo!

Risposte:


227

Dalla Spring 5 è sufficiente implementare l'interfaccia WebMvcConfigurer:

public class MvcConfig implements WebMvcConfigurer {

Questo perché Java 8 ha introdotto metodi predefiniti sulle interfacce che coprono la funzionalità della WebMvcConfigurerAdapterclasse

Vedere qui:

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


1
E se avessi super.configureMessageConverters(converters)come posso tradurre questo codice? Ora non c'è niente supera cui fare riferimento.
tryHard

1
@yami Devi solo chiamare configureMessageConverters (convertitori) questo eseguirà il metodo predefinito definito sull'interfaccia
Plog

@Plog, @Yami: Facendo come suggerito si produce un java.lang.StackOverflowError, perché l'omissione di .superavvia un ciclo di chiamate ricorsivo, senza fine.
ThirstForKnowledge

2
L'aggiunta di convertitori all'elenco disattiva la registrazione del convertitore predefinito. Chiamando prima super.configureMessageConverters (convertitori), probabilmente vorrai mantenere il convertitore predefinito. Per aggiungere semplicemente un convertitore senza influire sulla registrazione predefinita, prendere in considerazione l'utilizzo del metodo extendMessageConverters(java.util.List)( docs.spring.io/spring/docs/current/javadoc-api/org/… ).
ThirstForKnowledge

1
@ ThirstForKnowledge Oh questo è il mio male. Il modo in cui dovresti chiamare un metodo super predefinito su un'interfaccia è: WebMvcConfigurer.super.configureMessageConverters (convertitori)
Plog

7

Ho lavorato sulla libreria di documentazione equivalente a Swagger chiamata Springfoxoggigiorno e ho scoperto che nella Spring 5.0.8 (attualmente in esecuzione), l'interfaccia WebMvcConfigurerè stata implementata dalla classe di WebMvcConfigurationSupportclasse che possiamo estendere direttamente.

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

public class WebConfig extends WebMvcConfigurationSupport { }

Ed è così che l'ho usato per impostare il mio meccanismo di gestione delle risorse come segue:

@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

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

Con Spring Boot 2.1.4.RELEASE (Spring Framework 5.1.6.RELEASE), fai così

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

In primavera ogni richiesta passerà attraverso il DispatcherServlet . Per evitare la richiesta di file statici tramite DispatcherServlet (front contoller), configuriamo il contenuto statico MVC .

Primavera 3.1. ha introdotto ResourceHandlerRegistry per configurare ResourceHttpRequestHandlers per servire risorse statiche dal classpath, dal WAR o dal file system. Possiamo configurare ResourceHandlerRegistry a livello di codice all'interno della nostra classe di configurazione del contesto web.

  • abbiamo aggiunto il /js/**pattern al ResourceHandler, includiamo la foo.jsrisorsa che si trova nel filewebapp/js/directory
  • abbiamo aggiunto il /resources/static/**pattern a ResourceHandler, includiamo la foo.htmlrisorsa che si trova nella webapp/resources/directory
@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());
    }
}

Configurazione XML

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

Contenuto statico di Spring Boot MVC se il file si trova nella cartella webapp / resources di WAR .

spring.mvc.static-path-pattern=/resources/static/**
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.