Два варианта после того, как класс WebMvcConfigurerAdapter устарел

Spring Boot
Два варианта после того, как класс WebMvcConfigurerAdapter устарел

1. Введение

В этой статье я опишу серьезное предупреждение, о котором будет сообщено после обновления с spring 4.xx (или ниже) до Spring 5.xx и с Spring Boot 1.xx до Spring Boot 2.xx:"Warning:The type WebMvcConfigurerAdapter is deprecated.", а также быстрый анализ причины и решения для этого критического предупреждения.

2. Причина предупреждения

Если мы используем версию Spring 5.xx (или Spring Boot 2.xx) для сборки или обновления приложения, при настройке WebMvc появится это предупреждение, потому что в более ранних версиях Spring, если вы хотите настроить веб-приложение, вы можно быстро реализовать конфигурацию, расширив класс WebMvcConfigurerAdapter.Примерный код выглядит следующим образом:

package com.ramostear.page;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Spring 4(或者Spring Boot 1.x)版本配置Web应用程序示例
 * @author ramostear
 * @create-time 2019/4/18 0018-1:38
 */
@Configuration
public class OldMvcConfig extends WebMvcConfigurerAdapter{

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
        configurer.setUseSuffixPatternMatch(false);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/")
                .addResourceLocations("classpath:/META-INF/resources/")
                .addResourceLocations("classpath:/public/")
                .addResourceLocations("classpath:/resources/");
        super.addResourceHandlers(registry);
    }
}

WebMvcConfigurerAdapterэто реализацияWebMvcConfigurerАбстрактный класс для интерфейса и предоставляет пустые реализации всех методов, которые мы можем переопределить в его подклассах для реализации нашей собственной конфигурации, такой как преобразователи представлений, перехватчики и междоменная поддержка и т. д., благодаря Java. Обновление версии в Java 8, можно сделать с помощьюdefaultКлючевое слово добавляет в интерфейс методы по умолчанию, и Spring также синхронно поддерживает эту новую функцию в Java 8 во время процесса обновления. Вот простая реализация определения метода по умолчанию для интерфейса в Java 8:

public interface MyInterface{
    
    default void sayHello(){
        //...
    }
    
    void sayName(){}
    
    String writeName(){}
    
    //...
}

3. Решения

Как упоминалось ранее, начиная с Spring 5, интерфейс WebMvcConfigure содержит реализацию по умолчанию всех методов в классе WebMvcConfigurerAdapter, поэтому адаптер WebMvcConfigurerAdapter был помещен в холодный дворец.Ниже приведен пример частичного исходного кода класса WebMvcConfigurerAdapter:

/**
 * An implementation of {@link WebMvcConfigurer} with empty methods allowing
 * subclasses to override only the methods they're interested in.
 *
 * @author Rossen Stoyanchev
 * @since 3.1
 * @deprecated as of 5.0 {@link WebMvcConfigurer} has default methods (made
 * possible by a Java 8 baseline) and can be implemented directly without the
 * need for this adapter
 */
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}
    
    ...
}        

Забавный совет: мы можем настроить веб-приложение, реализуя методы в интерфейсе WebMvcConfigure, не позволяяWebMvcConfigurerAdapterэтопосредниксделать разницу.

Таким образом, мы нашли способ устранить предупреждение: напрямую реализовать интерфейс WebMvcConfigurer. Прежде чем мы подготовимся к работе с WebMvcConfigurer, давайте рассмотрим основы этого интерфейса:

public interface WebMvcConfigurer {

	default void configurePathMatch(PathMatchConfigurer configurer) {
	}

	/**
	 * Configure content negotiation options.
	 */
	default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}

	/**
	 * Configure asynchronous request handling options.
	 */
	default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	}
    
   ...
}       

Теперь мы можем приступить к настройке веб-приложения, примерный код выглядит следующим образом:

/**
 * Spring 5 (或者Spring Boot 2.x)版本配置Web应用程序示例
 * @author ramostear
 * @create-time 2019/4/18 0018-1:40
 */
@Configuration
public class MvcConfigure implements WebMvcConfigurer{

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/")
                .addResourceLocations("classpath:/public/")
                .addResourceLocations("classpath:/resources/");
    }
}

Таким образом предупреждение просто устраняется, а исходный унаследованный класс WebMvcConfigurerAdapter изменяется для реализации интерфейса WebMvcConfigurer, а остальное остается без изменений. Но следует отметить одну вещь: если вы обновляете старое приложение, вам необходимо очистить код вызова super() в методе.

На этом этапе наша программа снова может успешно работать. Тогда, кроме устраненияпосредникЕсть ли другой способ избежать предупреждения, сделав разницу? Ответ, конечно, да. В дополнение к устранению пути посредника для настройки веб-приложений из WebMvcConfigurer, мы также можем напрямую настраивать веб-приложения изWebMvcConfigurationSupportЭта конфигурация «поставщик» получает путь конфигурации в руки.WebMvcConfigurationSupport— это основной класс конфигурации, который предоставляет способ программной настройки веб-приложений на Java, поэтому мы можем настроитьпоставщикПолучите в руки, как настроено веб-приложение. Метод очень простой, просто нужно расширить этот класс и переопределить соответствующий метод. Так же, как и выше, давайте сначала посмотрим на внутреннюю общую структуру этого класса:

public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
	...
    /**
	 * Provide access to the shared handler interceptors used to configure
	 * {@link HandlerMapping} instances with.
	 * <p>This method cannot be overridden; use {@link #addInterceptors} instead.
	 */
	protected final Object[] getInterceptors() {
		...
	}
    
    /**
	 * Return a handler mapping ordered at Integer.MAX_VALUE-1 with mapped
	 * resource handlers. To configure resource handling, override
	 * {@link #addResourceHandlers}.
	 */
	@Bean
	@Nullable
	public HandlerMapping resourceHandlerMapping() {
		...
		handlerMapping.setPathMatcher(mvcPathMatcher());
		handlerMapping.setUrlPathHelper(mvcUrlPathHelper());
		handlerMapping.setInterceptors(getInterceptors());
		handlerMapping.setCorsConfigurations(getCorsConfigurations());
		return handlerMapping;
	}
}    

Вы видели что-то знакомое, есть перехватчики, статическое отображение ресурсов и т. д., теперь нам нужно только расширить этот класс и переопределить методы в нем для настройки нашего веб-приложения (также нужно использовать @Configuration Annotate класс расширения) , пример кода выглядит следующим образом:

/**
 * 消除警告的第二种配置选择
 * @author ramostear
 * @create-time 2019/4/7 0007-4:10
 */
@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        super.configurePathMatch(configurer);
        configurer.setUseSuffixPatternMatch(false);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/")
                .addResourceLocations("classpath:/META-INF/resources/")
                .addResourceLocations("classpath:/public/")
                .addResourceLocations("classpath:/resources/");
        super.addResourceHandlers(registry);
    }
}

4. Вывод

В этой статье путем быстрого поиска даются два разных решения для устранения серьезного предупреждения о том, что класс WebMvcConfigurerAdapter устарел из-за обновления версии Spring (или Spring Boot). Этот технический обмен заканчивается здесь, спасибо за ваше терпеливое чтение. Если у вас есть лучшее решение, когда вы сталкиваетесь с той же проблемой, вы можете оставить мне сообщение в области комментариев ниже.

Оригинальный автор: Тан Чаохун Исходное название: Два варианта после того, как WEBMVCCONFIGURERADAPTER устарел

Оригинальная ссылка:Уууу, Рамос слеза.com/articles/afan…