升级springBoot 2.2-->2.6.10改动点

本文详细介绍了Gradle从4.x到7.4.1的升级过程,包括API变更、Querydsl配置修改等。同时,涵盖了SpringBoot的版本升级,如SpringCloud至2021.0.3,依赖包更新,如Flyway、Resilience4j等,并指出代码中需要注意的修改点,如@Nonnull改为@NonNull,JPA事务配置等。还涉及了 Zuul网关的兼容性问题,以及PathVariable异常处理策略的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、Gradle 4.x→7.4.1

2、springBoot升级包修改

3、代码修改

4、配置修改

5、兼容zuul网关

6、PathVariable校验不通过默认返回500 =>修改为返回404错误


1、Gradle 4.x→7.4.1

1) 写法变更

  complie 修改为 api

  testcomplie 修改为   testImplementation

2)引入integrationTest 单测包

 升级org.unbroken-dome.test-sets至4.0.0

3)修改Querydsl配置

增加配置:

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
configurations {
    querydsl.extendsFrom compileClasspath
}
querydsl {
    library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = "${buildDir}/generated/java"
}

4)修改apply plugin:java

apply plugin: 'java-library'

2、springBoot升级包修改

1)springcloud 同步升级至2021.0.3版本2)指定flyway 版本为7.15.0  8版本开始不再支持mysql5.7版本

3)client中引入 包

api "org.springframework.cloud:spring-cloud-starter-loadbalancer"

4)移除spring-cloud-starter-netflix-ribbon引用 与spring-cloud-starter-loadbalancer冲突

5)hystrix已弃用 替换成spring官方推荐的 resilience4j 地址:https://github.com/resilience4j/resilience4j

5)指定commons-beanutils版本

6)指定commons-io版本

7)引入com.google.guava:guava包(如果项目中有用到的话)

8)com.cosium.spring.data:spring-data-jpa-entity-graph版本升级至 2.6.1

9)querydsl-jpa版本升级至5.0.0

10)org.glassfish:javax.el版本升级至3.0.1-b12

11)commons-validator:commons-validator升级至1.7 老版本有安全漏洞

12)org.apache.commons:commons-collections4升级至4.4 老版本有安全漏洞

13)org.springframework.security.oauth:spring-security-oauth2 升级至2.5.2.RELEASE 老版本有安全漏洞

14) 使用PostConstruct注解需要增加引用

api "jakarta.annotation:jakarta.annotation-api:1.3.5"

15)增加推荐缓存 caffeine引用

com.github.ben-manes.caffeine:caffeine

3、代码修改

1) FallbackFactory类 引用路径调整

2) @Email 注解类 引用路径调整

3)APPLICATION_JSON_UTF8_VALUE 被弃用 替换为APPLICATION_JSON_VALUE 新版会自动解析,不需要额外指定UTF-8字符集

4)@Nonnull注解修改为@NonNull

5)StringUtils 类需要修改为apache lang3包 spring中StringUtils中有多个方法过时

6)jodaTime在新版中已不再支持 换成JSR-310 增加jackson-jsr310包 在需要转换的Date类型字段增加@DateTimeFormat(pattern = "yyyy-MM-dd")   LocalDate类型会自动转换

api "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"

7)RequestMappingInfo原构造方法已过时 替换成build构造

8)RabbitTemplate setReturnCallback已过时,替换成setReturnsCallback

9)JPA 对于有内部entity的jpa bean ,lazy注解不再生效会自动生成inner join语句,需要按业务修改

10)JPA 对于所有数据库操作都会默认开启事务,在配置项加上

enableDefaultTransactions=false

关闭jpa默认事务

11)jpa的更新与删除必须要开启事务,否则会报

No EntityManager with actual transaction available for current thread 错误

12)MongoDbFactory已过时,无法正常注入 替换成MongoDatabaseFactory

13)配置taskExcutor线程池

@Configuration
public class AsyncConfig {

    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(20);
        // 设置最大线程数
        executor.setMaxPoolSize(50);
        // 允许核心线程超时
        executor.setAllowCoreThreadTimeOut(Boolean.TRUE);
        // 设置队列容量
        executor.setQueueCapacity(1000);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix("cloud-async-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}

4、配置修改

1)spring.profiles配置已过时,修改为spring.config.active.on-profile

2)ribbon已弃用,要使用新的服务配置

spring:
  cloud:
    discovery:
      client:
        simple:
          instances:
             bizr-tradec-service:
               - uri: ${bizr.tradec.server.name:http://xxxx}
             globiz-service:
               - uri: ${globiz.server.name:http://xxxx}
             tendata-accounts-service:
               - uri: ${server.name:http://xxxx}
             wenda-service:
               - uri: ${wenda.server.name:http://xxxx}
             globalsou-company-service:
               - uri: https://xxx.com
             mailsou-service:
               - uri: http://xxx.com
             mex-service:
               - uri: ${mex.server.name:http://xxxx}
             mail-service:
               - uri: ${dmx-edm.server.name:http://xxxx}

3)后端服务间调用要去掉网关的前缀

4)当使用@PathVariable注解时,对于jpa可能查不到结果情况要加上required = false

5)有路径匹配配置 增加配置参数

mvc:
  pathmatch:
    matching-strategy: ant_path_matcher

6)mysql驱动  com.mysql.jdbc.Driver 修改为  com.mysql.cj.jdbc.Driver

5、兼容zuul网关

1)指定spring-cloud-starter-netflix-zuul版本 为 2.2.10.RELEASE

1)新加ZuulConfiguration文件

package cn.tendata.wenda.webapp.config;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.CallbackFilter;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.cglib.proxy.NoOp;
import org.springframework.cloud.netflix.zuul.filters.RouteLocator;
import org.springframework.cloud.netflix.zuul.web.ZuulController;
import org.springframework.cloud.netflix.zuul.web.ZuulHandlerMapping;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ZuulConfiguration {

    /**
     * The path returned by ErrorController.getErrorPath() with Spring Boot < 2.5 (and no longer
     * available on Spring Boot >= 2.5).
     */
    private static final String ERROR_PATH = "/error";
    private static final String METHOD = "lookupHandler";

    /**
     * Constructs a new bean post-processor for Zuul.
     *
     * @param routeLocator    the route locator.
     * @param zuulController  the Zuul controller.
     * @param errorController the error controller.
     * @return the new bean post-processor.
     */
    @Bean
    public ZuulPostProcessor zuulPostProcessor(@Autowired RouteLocator routeLocator,
            @Autowired ZuulController zuulController,
            @Autowired(required = false) ErrorController errorController) {
        return new ZuulPostProcessor(routeLocator, zuulController, errorController);
    }

    private enum LookupHandlerCallbackFilter implements CallbackFilter {
        INSTANCE;

        @Override
        public int accept(Method method) {
            if (METHOD.equals(method.getName())) {
                return 0;
            }
            return 1;
        }
    }

    private enum LookupHandlerMethodInterceptor implements MethodInterceptor {
        INSTANCE;

        @Override
        public Object intercept(Object target, Method method, Object[] args,
                MethodProxy methodProxy) throws Throwable {
            if (ERROR_PATH.equals(args[0])) {
                // by entering this branch we avoid the ZuulHandlerMapping.lookupHandler method to trigger the
                // NoSuchMethodError
                return null;
            }
            return methodProxy.invokeSuper(target, args);
        }
    }

    private static final class ZuulPostProcessor implements BeanPostProcessor {

        private final RouteLocator routeLocator;
        private final ZuulController zuulController;
        private final boolean hasErrorController;

        ZuulPostProcessor(RouteLocator routeLocator, ZuulController zuulController,
                ErrorController errorController) {
            this.routeLocator = routeLocator;
            this.zuulController = zuulController;
            this.hasErrorController = (errorController != null);
        }

        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName)
                throws BeansException {
            if (hasErrorController && (bean instanceof ZuulHandlerMapping)) {
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(ZuulHandlerMapping.class);
                enhancer.setCallbackFilter(
                        LookupHandlerCallbackFilter.INSTANCE); // only for lookupHandler
                enhancer.setCallbacks(
                        new Callback[]{LookupHandlerMethodInterceptor.INSTANCE, NoOp.INSTANCE});
                Constructor<?> ctor = ZuulHandlerMapping.class.getConstructors()[0];
                return enhancer.create(ctor.getParameterTypes(),
                        new Object[]{routeLocator, zuulController});
            }
            return bean;
        }
    }
}


注意:使用zuul网关的项目无法使用spring-cloud-starter-loadbalancer,只能使用ribbon

在boot2.6使用ribbon时需要重写RibbonLoadBalancerClient类,并实现choose方法。

ServiceInstance choose(String serviceId, Request<T> request) 

6、PathVariable校验不通过默认返回500 =>修改为返回404错误

@ControllerAdvice
public class GlobalControllerExceptionHandler extends ResponseEntityExceptionHandler {

    /**
     * PathVariable 校验不通过 返回404错误
     */
    protected ResponseEntity<Object> handleMissingPathVariable(MissingPathVariableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        Map<String, Object> errorAttributes = new LinkedHashMap<>();
        status = HttpStatus.NOT_FOUND;
        errorAttributes.put("status", status.value());
        return new ResponseEntity<>(errorAttributes, status);
    }

}
### 关于 `vue-template-compiler@2.6.10` 和 Babel Loader 的兼容性 为了确保项目中的工具链能够正常工作,了解不同依赖之间的版本兼容性至关重要。以下是关于 `vue-template-compiler@2.6.10` 和 Babel Loader 版本兼容性的分析。 #### Vue Template Compiler 与 Vue 运行时的关系 `vue-template-compiler` 是 Vue 编译器的一部分,负责将 `.vue` 文件中的模板部分转换为渲染函数。它通常需要与特定版本的 Vue Runtime (`vue`) 配合使用,二者应保持相同的主版本号和次版本号以避免不兼容问题[^1]。因此,在使用 `vue-template-compiler@2.6.10` 时,建议同时安装 `vue@2.6.x` 系列版本作为运行时库。 #### Webpack 中的 Vue 加载流程 在基于 Webpack 的构建环境中,`.vue` 文件通过 `vue-loader` 被解析并处理。而 `vue-loader` 可能会调用到 `babel-loader` 来进一步编译 JavaScript 或 TypeScript 代码片段。这意味着 `babel-loader` 的版本选择会影响整个项目的构建过程。 对于 `vue-template-compiler@2.6.10` 所支持的环境而言,推荐使用的 `babel-loader` 版本范围如下: - **Babel Loader v7**: 如果您正在使用 Babel 7,则应该选用 `babel-loader@7.x` 或更高版本(如 `babel-loader@8.x`)。这是因为 Babel 7 提供了许多新特性和改进,适合现代前端开发需求。 具体来说,当您的项目已经锁定至 Vue 2.6 并希望维持稳定性时,可以选择以下组合之一: - `babel-loader@7.1.5`: 已被广泛验证适用于大多数场景,并且性能表现良好[^4]。 - `babel-loader@8.x`: 更新的选项,默认情况下也完全适配 Vue 2.x 生态系统[^4]。 需要注意的是,尽管理论上较新版的 `babel-loader` 应该向后兼容旧版功能,但在实际应用过程中仍需测试是否存在潜在冲突。 #### 安装命令示例 假设我们决定采用最新稳定版的 `babel-loader`, 下面是如何执行安装操作的具体方法: ```bash npm install vue@2.6.10 vue-template-compiler@2.6.10 babel-loader@latest --save-dev ``` 或者如果偏好指定确切的小版本号来减少不确定性风险的话, ```bash npm install vue@2.6.10 vue-template-compiler@2.6.10 babel-loader@7.1.5 --save-dev ``` 以上两条指令均会在当前目录下的 package.json 文件里记录下所选软件包及其对应版本信息. #### 总结 综上所述, 推荐搭配 `vue-template-compiler@2.6.10` 使用的 `babel-loader` 最佳实践方案包括但不限于: - 若追求长期维护和支持度较高的解决方案, 则优先考虑 `babel-loader@7.1.5`. - 如倾向于利用更新特性以及享受更频繁的安全补丁发布周期带来的好处, 则可以直接升级至最新的 `babel-loader@8.x`. 最终的选择取决于团队的技术栈现状和个人喜好等因素综合考量后的结果。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet-W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值