如何使用 Spring 引导配置 Sniffy?
How do I configure Sniffy with Spring Boot?
Sniffy 是一个很酷的小项目:
Sniffy counts the number of executed SQL queries and provides an API for validating them It is designed for unit tests and allows you to test if particular method doesn't make more than N SQL queries Especially it's useful to catch the ORM N+1 problem at early stages
它还提供了一个 servlet 过滤器,可以将 HTML 注入到一个页面中,弹出窗口显示您执行的查询。该文档解释了如何为传统的基于 web.xml
的应用程序而不是 Spring Boot 配置它。我设法通过将此 bean 添加到 @Configuration
class:
来注册 servlet 过滤器
@Bean
public FilterRegistrationBean snifferFilter()
{
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
SnifferFilter filter = new SnifferFilter();
filter.setInjectHtml(true);
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.setName("sniffer");
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
我还更新了 JDBC url,文档说:
add sniffer: prefix to the JDBC connection url For example jdbc:h2:~/test should be changed to sniffer:jdbc:h2:mem:
所以我在 application.yml
中添加了以下内容:
spring.datasource.url: sniffer:jdbc:mysql://localhost:3306
但是当我启动我的应用程序时它失败并出现以下错误:
URL must start with 'jdbc'
我设法找出问题所在,Spring Boot 广泛使用自动配置并试图从连接字符串中检测 DatabaseDriver
。由于连接字符串不再以 jdbc
开头,因此遇到了问题。
这只是在我的 application.yml
中指定 driver-class-name
而不是让 Spring 引导尝试自动检测它的情况:
spring.datasource.driver-class-name: io.sniffy.MockDriver
这里是 Sniffy 作者!
事实上,从版本 3.0.7(2016 年 4 月)开始,您必须在 Spring 启动应用程序中明确指定驱动程序 class 名称。错误跟踪器中有一个 open issue 可以自动配置它。
顺便说一句,sniffy 3.0.5 引入了开箱即用的支持 Spring Boot using @EnableSniffy
annotation,所以你不必自己创建 FilterRegistrationBean
不再 - 只需将注释添加到您的应用程序 class 中,如下所示:
import io.sniffy.boot.EnableSniffy;
@SpringBootApplication
@EnableAutoConfiguration
@EnableSniffy
public class Application {
public static void main(String[] args) throws ClassNotFoundException {
SpringApplication.run(Application.class, args);
}
}
Sniffy 是一个很酷的小项目:
Sniffy counts the number of executed SQL queries and provides an API for validating them It is designed for unit tests and allows you to test if particular method doesn't make more than N SQL queries Especially it's useful to catch the ORM N+1 problem at early stages
它还提供了一个 servlet 过滤器,可以将 HTML 注入到一个页面中,弹出窗口显示您执行的查询。该文档解释了如何为传统的基于 web.xml
的应用程序而不是 Spring Boot 配置它。我设法通过将此 bean 添加到 @Configuration
class:
@Bean
public FilterRegistrationBean snifferFilter()
{
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
SnifferFilter filter = new SnifferFilter();
filter.setInjectHtml(true);
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.setName("sniffer");
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
我还更新了 JDBC url,文档说:
add sniffer: prefix to the JDBC connection url For example jdbc:h2:~/test should be changed to sniffer:jdbc:h2:mem:
所以我在 application.yml
中添加了以下内容:
spring.datasource.url: sniffer:jdbc:mysql://localhost:3306
但是当我启动我的应用程序时它失败并出现以下错误:
URL must start with 'jdbc'
我设法找出问题所在,Spring Boot 广泛使用自动配置并试图从连接字符串中检测 DatabaseDriver
。由于连接字符串不再以 jdbc
开头,因此遇到了问题。
这只是在我的 application.yml
中指定 driver-class-name
而不是让 Spring 引导尝试自动检测它的情况:
spring.datasource.driver-class-name: io.sniffy.MockDriver
这里是 Sniffy 作者!
事实上,从版本 3.0.7(2016 年 4 月)开始,您必须在 Spring 启动应用程序中明确指定驱动程序 class 名称。错误跟踪器中有一个 open issue 可以自动配置它。
顺便说一句,sniffy 3.0.5 引入了开箱即用的支持 Spring Boot using @EnableSniffy
annotation,所以你不必自己创建 FilterRegistrationBean
不再 - 只需将注释添加到您的应用程序 class 中,如下所示:
import io.sniffy.boot.EnableSniffy;
@SpringBootApplication
@EnableAutoConfiguration
@EnableSniffy
public class Application {
public static void main(String[] args) throws ClassNotFoundException {
SpringApplication.run(Application.class, args);
}
}