1. 程式人生 > >spring boot 專案重新搭建----------mvc配置:型別轉換器

spring boot 專案重新搭建----------mvc配置:型別轉換器

實現WebMvcConfigurer介面:

1.configurePathMatch路徑配置:

  • setUseSuffixPatternMatch : 設定是否是字尾模式匹配,如“/user”是否匹配/user.*,預設為true
  • setUseTrailingSlashMatch : 設定是否自動字尾路徑模式匹配,如“/user”是否匹配“/user/”,預設為true.

2.configureContentNegotiation 內容協商配置

   用於實現一個請求路徑返回多種資料格式

configurer.useJaf(false).favorPathExtension(false).favorParameter(true)

.parameterName(“mediaType”).ignoreAcceptHeader(true).defaultContentType(MediaType.APPLICATION_JSON);

設定不使用jaf,不使用路徑上的資訊來指定,使用url上的引數來指定返回的內容形式,引數名mediaType,忽略HttpHeader上的Accept引數,設定預設的資料返回型別是JSON。如果需要返回其他型別則在請求url上加引數 ?mediaType=xml

3.configureAsyncSupport 非同步請求配置

  可配置超時時間,延遲結果攔截器,回撥攔截器

4.configureDefaultServletHandling 預設配置靜態資源servlet處理

     configurer.enable()相當於開啟根目錄下的檔案能被訪問(DispathcerServlet對映的路徑是:/ 攔截所有請求不能訪問根目錄)

5.addFormatters新增型別轉換

 建立一個bean工具類(用於獲取繼承或實現某個類的集合)

@Override
public void addFormatters(FormatterRegistry registry) {
    for (Converter<?, ?> converter : BeanKit.getListOfType(Converter.class)) {
        registry.addConverter(converter);
    }
    for (GenericConverter converter : BeanKit.getListOfType(GenericConverter.class)) {
        registry.addConverter(converter);
    }
    for (Formatter<?> formatter : BeanKit.getListOfType(Formatter.class)) {
        registry.addFormatter(formatter);
    }
}

註冊期中新增所有自定義的轉換類

自己再來實現一個轉換器如:string->localdate

@Component
public class StringToLocalDateConverter  implements GenericConverter {
    private static final int YEAR_MONTH_LENGTH=7;
    private static final int LOCAL_DATE_LENGTH=10;

    @Override
    public Set<ConvertiblePair> getConvertibleTypes() {
        Set<ConvertiblePair> pairs = new HashSet<>();
        pairs.add(new ConvertiblePair(String.class, LocalDate.class));
        pairs.add(new ConvertiblePair(String.class, YearMonth.class));
        return pairs;
    }
    @Override
    public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        //2018-11-11       2018-11
        if (sourceType.getType() == String.class) {
            String time = (String) source;
            try {
                if (time.length() == YEAR_MONTH_LENGTH) {
                    return YearMonth.parse(time);
                }
                if (time.length() == LOCAL_DATE_LENGTH) {
                    return LocalDate.parse(time);
                }
            } catch (Exception e) {
                throw new IllegalArgumentException("字串型別不匹配",e);
            }
        }
        return source;
    }
}型別轉換的接受類要是沒有無參構造,可能會報錯(解決:1.用實體類來接受 [email protected](required = false)LocalDate time)