springboot配置druid的监控功能时ServletRegistrationBean<StatViewServlet>报红——javax与jakarta冲突

原文

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import jakarta.servlet.Servlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServlet;
import javax.sql.DataSource;

@Configuration
public class MyDataSourceConfig {
   @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }
    //配置druid的监控页功能
    @Bean
    public ServletRegistrationBean statViewServlet(){
     StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> statViewServletServletRegistrationBean = new ServletRegistrationBean<StatViewServlet>(statViewServlet, "/druid/");
        return statViewServletServletRegistrationBean;
    }
}

报错

在这里插入图片描述

原因

原因:springboot与druid不兼容。
springboot版本是3.0以上,此版本内嵌的tomcat版本是tomcat 10, 因此springboot中ServletRegistrationBean的泛型所使用的Servelt是来自的jakarta扩展包。本文使用的StatViewServlet(第三方依赖(druid)的API类),由于引入的druid版本低(其内部的所有API类所使用的Servlet来自javax扩展包)。其根本是javax.servlet与jakarta.servlet冲突。

具体展示

这是springboot提供的API ServletRegistrationBean
在这里插入图片描述
----------------------------------------------------------分隔线-----------------------------------------------------------------
这是StatViewServlet,来自druid第三方API。
在这里插入图片描述
点开StatViewServlet发现其依赖的是javax.servlet.*
在这里插入图片描述

知识延伸:
在Java生态系统中,javax是一个缩写,代表Java Extension。javax作为包名,包含了一系列的Java扩展包,例如Servelt、JDBC等。随着时间的推移,Java技术不断发展,Java生态不断壮大,Jakarta应运而生代替了原来javax的作用,旨在为Java技术和规范提供更一个开放,中立的基础。例如:Jakarta EE(2019之前叫Java EE),Jakarta JSON等。
Jakarta提供了常用的API和规范,如Servelt,JPA,JMS等。
Tomcat——Jakarta EE(Java EE)的重要项目。在Tomcat 10版本之前,Java Servlet等扩展包是以javax包为前缀,在Tomcat 10版本之后,javax被替换成jakarta。

解决方法

提升druid依赖版本(建议),或降低springboot版本(不建议)。
要么都用javax.servelt, 要么都用jakarta.servlet, 统一servlet即可。

总结

因为Servelt很常用,应用场景也很广,很多第三方依赖都使用它,有时引入不同的依赖,由于版本问题,会产生javax与jakarta冲突,这是很多报错问题的根源,本文是一个典型的例子。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
以上代码是Maven中的依赖配置代码,第一个依赖是针对阿里巴巴的Druid数据库连接池,在Spring Boot项目中使用。第二个依赖是针对Apache ShardingSphere分库分表框架的Spring Boot Starter。 代码本身没有什么问题,但可以考虑进行以下优化: 1. 版本号的统一管理:将Druid和ShardingSphere的版本号统一管理,可以提升代码的可维护性和升级效率。 2. 排除冲突依赖:如果项目中已经存在了Druid和ShardingSphere的相关依赖,可以在配置排除掉冲突的依赖,避免出现版本冲突等问题。 3. 按需引入依赖:如果项目中只需要使用Druid或ShardingSphere中的某一个,可以只引入需要的依赖,避免不必要的依赖增加项目体积。 4. 优化依赖顺序:将依赖按照优先级排序,可以减少不必要的依赖引入,提高项目启动效率。 示例代码: ```xml <properties> <druid.version>1.2.4</druid.version> <sharding.version>4.1.1</sharding.version> </properties> <dependencies> <!-- Druid数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </exclusion> </exclusions> </dependency> <!-- ShardingSphere分库分表框架 --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding.version}</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </exclusion> </exclusions> </dependency> </dependencies> ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lazyKinh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值