【发布时间】:2023-03-25 06:30:02
【问题描述】:
我正在使用 vaadin-spring-boot-starter 来集成 Vaadin Framework 14 和 Spring Boot。
我想重写SpringServlet 类的requestStart 和requestEnd 方法来做以下事情:
- 将当前路由/视图路径和当前用户 ID 等内容放入 SLF4J MDC,以便将其包含在每个日志记录语句中
- 记录请求的持续时间
在 Vaadin 8 中有一个 SpringVaadinServlet 类,我可以通过简单地用 @SpringComponent("vaadinServlet") 注释我的自定义子类来替换它。
这种方法不再有效。 vaadin-spring 集成包含 SpringBootConfiguration,其中包含对 SpringServlet 构造函数的直接调用:
@Bean
public ServletRegistrationBean<SpringServlet> servletRegistrationBean() {
String mapping = configurationProperties.getUrlMapping();
Map<String, String> initParameters = new HashMap<>();
boolean rootMapping = RootMappedCondition.isRootMapping(mapping);
if (rootMapping) {
mapping = VaadinServletConfiguration.VAADIN_SERVLET_MAPPING;
initParameters.put(Constants.SERVLET_PARAMETER_PUSH_URL,
VaadinMVCWebAppInitializer
.makeContextRelative(mapping.replace("*", "")));
}
ServletRegistrationBean<SpringServlet> registration = new ServletRegistrationBean<>(
new SpringServlet(context, rootMapping), mapping); // <-- HERE
registration.setInitParameters(initParameters);
registration.setAsyncSupported(configurationProperties.isAsyncSupported());
registration.setName(
ClassUtils.getShortNameAsProperty(SpringServlet.class));
return registration;
}
他们应该在这里使用条件 bean,以便我们可以替换它,但不幸的是他们没有。
仅添加带有上述代码副本的自定义ServletRegistrationBean(但构造函数调用替换为我自己的)不起作用,即使使用@Primary。
那么有没有比排除整个 vaadin-spring 自动配置并复制我自己的配置 bean 中的所有内容更好的方法来做我想做的事?它可以工作,但我必须在每次 vaadin-spring 升级后检查一切是否仍然正常。
【问题讨论】:
标签: spring-boot vaadin vaadin-flow