Spring Boot

Spring Cloud Greenwich.SR4 升级为Ho

2019-12-30  本文已影响0人  EasyNetCN

以下内容以本人的环境为参考

花了差不多两天的时间,把Spring Cloud Greenwich.SR4升级为Hoxton.SR1

pom.xml使用最新版本的Spring Boot和Spring Cloud

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

pom.xml中使用最新的loadbalancer

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

如果没有使用feign,可以bootstrap.yml使用reactor loadbalancer

spring:
  application:
    name: activity-service
  profiles:
    active: development-local
  cloud:
    consul:
      host: ${consul.host:localhost}
      port: ${consul.port:8500}
      discovery:
        prefer-ip-address: true
      config:
        enabled: true
        format: yaml
        default-context: ${spring.application.name}
    loadbalancer:
      ribbon:
        enabled: false

如果使用了feign,使用reactor loadbalancer会有异常,暂时没有找到解决方法

使用feign,需要定义HttpMessageConverters,参考如下

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class HttpMessageConverterConfig {

    @Bean
    public HttpMessageConverters messageConverters(ObjectMapper objectMapper) {
        return new HttpMessageConverters() {
            @Override
            protected List<HttpMessageConverter<?>> postProcessConverters(List<HttpMessageConverter<?>> converters) {
                var index = 0;

                for (var i = 0; i < converters.size(); i++) {
                    var converter = converters.get(i);

                    if (converter instanceof MappingJackson2HttpMessageConverter) {
                        index = i;
                    }
                }

                converters.remove(index);

                var jsonConverter = new MappingJackson2HttpMessageConverter(objectMapper);

                converters.add(jsonConverter);

                return converters;
            }
        };
    }
}

自定义日期格式化:yyyy-MM-dd HH:mm:ss

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

@Configuration
public class JsonConfig {
    @Bean
    public LocalDateTimeDeserializer localDateTimeDeserializer(JacksonProperties jacksonProperties) {
        return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat()));
    }

    @Bean
    public LocalDateTimeSerializer localDateTimeSerializer(JacksonProperties jacksonProperties) {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(jacksonProperties.getDateFormat()));
    }

    @Bean
    @Primary
    public SimpleModule localDateTimeSimpleModule(LocalDateTimeDeserializer localDateTimeDeserializer,
            LocalDateTimeSerializer localDateTimeSerializer) {
        SimpleModule module = new SimpleModule();

        module.addSerializer(LocalDateTime.class, localDateTimeSerializer);
        module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);

        return module;
    }

    @Bean
    @Primary
    public ObjectMapper objectMapper(SimpleModule localDateTimeSimpleModule, JacksonProperties jacksonProperties) {
        var objectMapper = new ObjectMapper();

        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        objectMapper.registerModule(localDateTimeSimpleModule);
        objectMapper.setDateFormat(new SimpleDateFormat(jacksonProperties.getDateFormat()));

        return objectMapper;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读