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