All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zodiac.autoconfigure.web.ServletHttpMessageAutoConfiguration Maven / Gradle / Ivy

package org.zodiac.autoconfigure.web;

import java.util.Iterator;
import java.util.List;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.ResourceRegionHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.zodiac.autoconfigure.jackson.PlatformJacksonOptionProperties;
import org.zodiac.commons.util.Colls;
import org.zodiac.commons.util.DateTimes;
import org.zodiac.commons.util.lang.Strings;
import org.zodiac.core.web.http.converter.MappingApiJackson2HttpMessageConverter;
import org.zodiac.core.web.http.converter.StringOrJsonHttpMessageConverter;
import org.zodiac.core.web.remote.servlet.RemoteApiFilterInterceptor;
import org.zodiac.core.web.servlet.ConventionalMethodArgumentResolver;

import com.fasterxml.jackson.databind.ObjectMapper;

@SpringBootConfiguration
@Order(value = Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(value = {javax.servlet.Servlet.class, org.springframework.web.servlet.DispatcherServlet.class})
public class ServletHttpMessageAutoConfiguration implements WebMvcConfigurer {

    private final ObjectMapper objectMapper;
    private final RemoteApiFilterInterceptor remoteApiFilterInterceptor;
    private final PlatformJacksonOptionProperties platformJacksonOptionProperties;

    public ServletHttpMessageAutoConfiguration(ObjectProvider objectMapperProvider,
        ObjectProvider remoteApiFilterInterceptorProvider,
        PlatformJacksonOptionProperties platformJacksonOptionProperties) {
        this.objectMapper = objectMapperProvider.getIfAvailable();
        this.remoteApiFilterInterceptor = remoteApiFilterInterceptorProvider.getIfAvailable();
        this.platformJacksonOptionProperties = platformJacksonOptionProperties;
    }

    /*使用 JACKSON 作为JSON MessageConverter 消息转换,内置断点续传,下载和字符串。*/
    @Override
    public void configureMessageConverters(List> converters) {
        converters.removeIf(
            x -> x instanceof StringHttpMessageConverter || x instanceof AbstractJackson2HttpMessageConverter);
        converters.add(new StringHttpMessageConverter(platformJacksonOptionProperties.getCharset()));
        converters.add(new ByteArrayHttpMessageConverter());
        converters.add(new ResourceHttpMessageConverter());
        converters.add(new ResourceRegionHttpMessageConverter());
        converters.add(new MappingApiJackson2HttpMessageConverter(platformJacksonOptionProperties, objectMapper));

        if (null != remoteApiFilterInterceptor) {
            Iterator> it = converters.iterator();
            List> customeCovertList = Colls.list();
            while (it.hasNext()) {
                HttpMessageConverter converter = it.next();
                if (!Strings.startsWithIgnoreCase(converter.getClass().getName(), "org.springframework")) {
                    customeCovertList.add(converter);
                }
            }
            converters.removeAll(customeCovertList);
            StringOrJsonHttpMessageConverter converter = objectMapper == null ? new StringOrJsonHttpMessageConverter()
                : new StringOrJsonHttpMessageConverter(objectMapper);
            if (!customeCovertList.isEmpty()) {
                converters.addAll(0, customeCovertList);
                converters.add(customeCovertList.size(), converter);
            } else {
                converters.add(0, converter);
            }
        }

    }

    /*日期格式化*/
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new DateFormatter(DateTimes.FORMAT_10));
        registry.addFormatter(new DateFormatter(DateTimes.FORMAT_22_b));
    }

    @Override
    public void addArgumentResolvers(List resolvers) {
        resolvers.add(new ConventionalMethodArgumentResolver());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy