springboot不同版本踩坑记

总体

Java版本要求的变化

在Spring Boot 2.0中提高了对Java版本的要求,我们需要至少使用Java 8才能使用它,如果您的Spring Boot应用还运行在Java 7上,那就要考虑升级jdk或者不要升级到Spring Boot 2.0版本

Spring Boot 1.X没有支持Java 9的计划,如果后期需要Java 9的新特性,那么还是要升级到Spring Boot 2.0,否则可以不考虑升级问题

依赖组件的升级

Spring Boot 2.0在组建支持方面做了更新,然后支持的组建如下:

​Tomcat升级至8.5
Flyway升级至5
Hibernate升级至5.2
Thymeleaf升级至3
Tomcat漏洞问题。经查Spring Boot 2.0选用的版本为8.5.28,属于安全版本,所以大家可以放心使用。

配置重定位

在Spring Boot 2.0中对于配置属性的重定位也是比较多的,这将导致一些原有的配置将不再生效,需要我们手工的去修改这些配置的Key来完成升级适配。比如,一些与servlet相关的 server.* 属性重定位到 server.servlet 前缀下:

Old property	New property
server.context-parameters.*	server.servlet.context-parameters.*
server.context-path	server.servlet.context-path
server.jsp.class-name	server.servlet.jsp.class-name
server.jsp.init-parameters.*	server.servlet.jsp.init-parameters.*
server.jsp.registered	server.servlet.jsp.registered
server.servlet-path	server.servlet.path

不同版本RedisProperties的区别

#boot2.x配置
spring:
  redis:
    database: 0 # Database index used by the connection factory.
    timeout: 0 # Connection timeout in milliseconds.
    jedis:
      pool:
        max-active: 8 # 
        max-idle: 8 # 
        max-wait: -1 # 
        min-idle: 1 # 
 
# boot1.x配置
spring:
  datasource:
  redis:
    database: 0 # Database index used by the connection factory.
    timeout: 0 # Connection timeout in milliseconds.
    pool:
      max-active: 8 #
      max-idle: 8 # 
      max-wait: -1 # 
      min-idle: 1 # 

这是springboot版本为1.3.2RELEASE中的RedisProperties配置文件类,从图片中可以看得出来该本的redis配置文件属性有两个内部静态类分别是Pool和Sentinel,七个属性变量。列入我们想在配置文件中设置redis数据库host地址,则可以这样写

#  host为属性
spring.redis.host=localhost 
#配置连接池的最大连接数 
spring.redis.pool.max-active=8

《springboot不同版本踩坑记》

这个是redis在application.properties中springboot低版本的配置

# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

下图则是springboot版本为2.0.2RELEASE中的RedisProperties配置文件类,从图中可知pool属性则被封装到了内部静态类Jedis和Lettuce中去了,这时我们要是配置连接池的最大连接数,前缀还是spring.redis,有两种途径

spring.redis.**jedis**.pool.max-active=8  或者 spring.redis.**lettuce**.pool.max-active=8 

《springboot不同版本踩坑记》

这个是redis在application.properties中springboot高版本的配置

# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.jedis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.jedis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.jedis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.jedis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

maven下pom中的坐标配置

springboot版本1.4以下

<!--引入 spring-boot-starter-redis(1.4版本前)-->	<dependency>		<groupId>org.springframework.boot</groupId>		<artifactId>spring-boot-starter-redis</artifactId>		<version>1.3.2.RELEASE</version>	</dependency>

springboot版本1.4以上

<!--引入 spring-boot-starter-data-redis(1.4版本后)多了个data加个红和粗吧-->	<dependency>		<groupId>org.springframework.boot</groupId>		<artifactId>spring-boot-starter-data-redis</artifactId>	</dependency>

SpringBoot 2.0 文件上传踩坑

在项目中,有个需求是前端传递Excel文件到后端,后端读取Excel文件中的数据,保存到数据库中,刚开始Exccel中存在少量的几十条数据,上传读取没有问题,后来需求方说文件中可能会有10W+条数据,当我再次测试的时候发现后端报错了:The field file exceeds its maximum permitted size of 1048576 bytes
后来才想起因为SpringBoot自带集成的Tomcat限制了文件上传大小,如果文件大于1M,则需要在application.yml配置文件中重新设置:

SpringBoot 2.0版本:

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 10Mb
      max-request-size: 100Mb

同时,1.x版本和2.x版本的配置方式也不一样,又是一个坑:

SpringBoot1.5.9版本

    spring:
      http:
        multipart:
          enabled: true
          max-file-size: 10Mb
          max-request-size: 100Mb

除了这种方式以外,还有另外一种方式可以处理:
编写一个Bean:

/**  
     * 文件上传配置  
     * @return  
     */  
    @Bean  
    public MultipartConfigElement multipartConfigElement() {  
        MultipartConfigFactory factory = new MultipartConfigFactory();  
        //单个文件最大  
        factory.setMaxFileSize("10MB"); //KB,MB  
        //设置总上传数据总大小  
        factory.setMaxRequestSize("100MB");  
        return factory.createMultipartConfig();  
    }

这样就可以解决因为文件太大导致失败的问题。

Redis

从配置最明显的来看,RedisCacheManager类初始化不再以RedisTemplate为参数进行初始化,顺带引起了一些变化,遂记录于此。

springboot 1.5.x 版本

  1. 引入依赖

    org.springframework.boot
    spring-boot-starter-data-redis
    1.5.2.RELEASE

  2. application.yml/properties配置
    spring:
    cache:
    type: redis
    redis:
    host: 127.0.0.1
    port: 6379
    timeout: 0
    database: 0
    pool:
    max-active: 8
    max-wait: -1
    max-idle: 8
    min-idle: 0
    到此springboot可以以通用方式配置redis缓存了。但是如果需要特殊处理,则需要自己利用代码进行配置了,比如 序列与反序列化方式, redis缓存key的生成方案等等。

  3. 按需配置
    /**

  • Created by xiaoyiyiyo on 2018/4/28.
    */
    @EnableCaching
    @Configuration
    public class RedisCacheConfig extends CachingConfigurerSupport{

    @Bean
    public RedisTemplate redisTemplate() {

     Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
     ObjectMapper om = new ObjectMapper();
     om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
     //全局开关,支持jackson在反序列是使用多态
     om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
     jackson2JsonRedisSerializer.setObjectMapper(om);
    
     StringRedisTemplate redisTemplate = new StringRedisTemplate();
     redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
     return redisTemplate;
    

    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
    RedisCacheManager manager = new RedisCacheManager(redisTemplate);
    manager.setUsePrefix(true);
    RedisCachePrefix cachePrefix = new RedisPrefix(“prefix”);
    manager.setCachePrefix(cachePrefix);
    // 整体缓存过期时间
    manager.setDefaultExpiration(3600L);
    // 设置缓存过期时间。key和缓存过期时间,单位秒
    Map<String, Long> expiresMap = new HashMap<>();
    expiresMap.put(“user”, 1000L);
    manager.setExpires(expiresMap);
    return manager;
    }

    /**

    • 缓存的key是 包名+方法名+参数列表
      */
      @Bean
      @Override
      public KeyGenerator keyGenerator() {
      return (target, method, objects) -> {
      StringBuilder sb = new StringBuilder();
      sb.append(target.getClass().getName());
      sb.append(“::” + method.getName() + “:”);
      for (Object obj : objects) {
      sb.append(obj.toString());
      }
      return sb.toString();
      };
      }
      }

springboot 2.x 版本

  1. 引入依赖
    同1.5.x

  2. application.yml/properties配置
    2.x版本默认redis客户端连接池类型有所不同。

版本 默认客户端类型
1.5.x jedis
2.x lettuce
所以配置连接池的时候会有不同,如下:
application.yml

2.x版本中由于引入了不同客户端,需要指定配置哪种连接池

jedis客户端

spring:
  cache:
    type: redis
  redis:
    host: 127.0.0.1
    port: 6379
    timeout: 0
    database: 0
    jedis:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0
  1. 按需配置
package com.xiaoyiyiyo.configuration;

  @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //补上
        return om;
    }

    @Bean
    public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer (ObjectMapper om) {

        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(om);

        return serializer;
    }

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory,
                                       GenericJackson2JsonRedisSerializer serializer) {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);//key序列化
        redisTemplate.setValueSerializer(serializer);//value序列化
        redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化
        redisTemplate.setHashValueSerializer(serializer);//Hash value序列化
        redisTemplate.afterPropertiesSet();
        return redisTemplate;

    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate ) {
        RedisCacheManager manager = new RedisCacheManager(redisTemplate);
        manager.setUsePrefix(true);

        // 整体缓存过期时间
        manager.setDefaultExpiration(3600L);
        // 设置缓存过期时间。key和缓存过期时间,单位秒
        Map<String, Long> expiresMap = new HashMap<>();
        expiresMap.put("user", 1000L);
        manager.setExpires(expiresMap);
        return manager;
    }

//    @Bean
//    public RedisCacheConfiguration redisCacheConfiguration(GenericJackson2JsonRedisSerializer serializer) {
//        return RedisCacheConfiguration
//                .defaultCacheConfig()
//                .serializeKeysWith(
//                        RedisSerializationContext
//                                .SerializationPair
//                                .fromSerializer(new StringRedisSerializer()))
//                .serializeValuesWith(
//                        RedisSerializationContext
//                                .SerializationPair
//                                .fromSerializer(serializer));
//    }

    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return (target, method, objects) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append("::" + method.getName() + ":");
            for (Object obj : objects) {
                sb.append(obj.toString());
            }
            return sb.toString();
        };
    }

推荐阅读
>>清欢的博客
>>学习交流或获取更多资料欢迎加入QQ群:874514813

    原文作者:清欢ysy
    原文地址: https://blog.csdn.net/qq_33840251/article/details/89431659
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞