Loại WebMvcConfigurerAdapter không được dùng nữa


116

Tôi vừa chuyển sang phiên bản mvc mùa xuân 5.0.1.RELEASEnhưng đột nhiên trong nhật thực STS WebMvcConfigurerAdapter được đánh dấu là không được dùng nữa

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

Làm thế nào tôi có thể loại bỏ điều này!

Câu trả lời:


227

Kể từ Spring 5, bạn chỉ cần triển khai giao diện WebMvcConfigurer:

public class MvcConfig implements WebMvcConfigurer {

Điều này là do Java 8 đã giới thiệu các phương thức mặc định trên các giao diện bao gồm chức năng của WebMvcConfigurerAdapterlớp

Xem tại đây:

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


1
Điều gì sẽ xảy ra nếu tôi có super.configureMessageConverters(converters)làm thế nào bây giờ tôi có thể dịch mã này? Bây giờ không có gì superđể tham khảo.
tryHard

1
@yami Bạn chỉ cần gọi configureMessageConverters (bộ chuyển đổi) này sẽ chạy phương pháp mặc định được xác định trên giao diện
plog

@Plog, @Yami: Làm như đã đề xuất sẽ tạo ra a java.lang.StackOverflowError, bởi vì bỏ qua phần .superbắt đầu một vòng lặp gọi đệ quy, không bao giờ kết thúc.
ThirstForKnowledge

2
Thêm trình chuyển đổi vào danh sách, tắt đăng ký trình chuyển đổi mặc định. Bằng cách gọi super.configureMessageConverters (bộ chuyển đổi), trước tiên bạn có thể muốn giữ bộ chuyển đổi mặc định. Để chỉ cần thêm trình chuyển đổi mà không ảnh hưởng đến đăng ký mặc định, hãy xem xét sử dụng phương pháp extendMessageConverters(java.util.List)( docs.spring.io/spring/docs/current/javadoc-api/org/… ) thay thế.
ThirstForKnowledge

1
@ThirstForKnowledge Ồ, tệ thật. Cách bạn nên gọi một phương thức siêu mặc định trên một giao diện là: WebMvcConfigurer.super.configureMessageConverters (bộ chuyển đổi)
Plog

7

Tôi đã làm việc trên thư viện tài liệu tương đương Swagger được gọi là Springfoxngày nay và tôi thấy rằng trong Spring 5.0.8 (đang chạy hiện tại), giao diện WebMvcConfigurerđã được triển khai bởi lớp WebMvcConfigurationSupportlớp mà chúng tôi có thể mở rộng trực tiếp.

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

public class WebConfig extends WebMvcConfigurationSupport { }

Và đây là cách tôi đã sử dụng nó để thiết lập cơ chế xử lý tài nguyên của mình như sau:

@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

Sử dụng org.springframework.web.servlet.config.annotation.WebMvcConfigurer

Với Spring Boot 2.1.4.RELEASE (Spring Framework 5.1.6.RELEASE), hãy làm như thế này

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

Trong Spring, mọi yêu cầu sẽ đi qua DispatcherServlet . Để tránh yêu cầu tệp tĩnh thông qua DispatcherServlet (Front contoller), chúng tôi cấu hình nội dung MVC Static .

Mùa xuân 3.1. đã giới thiệu ResourceHandlerRegistry để cấu hình ResourceHttpRequestHandlers để cung cấp tài nguyên tĩnh từ classpath, WAR hoặc hệ thống tệp. Chúng ta có thể định cấu hình ResourceHandlerRegistry theo chương trình bên trong lớp cấu hình ngữ cảnh web của chúng ta.

  • chúng tôi đã thêm /js/**mẫu vào ResourceHandler, cho phép bao gồm foo.jstài nguyên nằm trong webapp/js/thư mục
  • chúng tôi đã thêm /resources/static/**mẫu vào ResourceHandler, cho phép bao gồm foo.htmltài nguyên nằm trong webapp/resources/thư mục
@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());
    }
}

Cấu hình XML

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

Spring Boot MVC Nội dung tĩnh nếu tệp nằm trong thư mục tài nguyên / ứng dụng web của WAR .

spring.mvc.static-path-pattern=/resources/static/**
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.