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的监控功能时ServletRegistrationBean<StatViewServlet>报红——javax与jakarta冲突_第1张图片

原因

原因: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
springboot配置druid的监控功能时ServletRegistrationBean<StatViewServlet>报红——javax与jakarta冲突_第2张图片
----------------------------------------------------------分隔线-----------------------------------------------------------------
这是StatViewServlet,来自druid第三方API。
springboot配置druid的监控功能时ServletRegistrationBean<StatViewServlet>报红——javax与jakarta冲突_第3张图片
点开StatViewServlet发现其依赖的是javax.servlet.*
springboot配置druid的监控功能时ServletRegistrationBean<StatViewServlet>报红——javax与jakarta冲突_第4张图片

知识延伸:
在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冲突,这是很多报错问题的根源,本文是一个典型的例子。

你可能感兴趣的:(疑难杂症栏,spring,boot,java,servlet,tomcat)