Skip to content

Commit dd45b68

Browse files
matteo-mara-sonarsourcesonartech
authored andcommitted
SONAR-26738 Upgrade Spring Framework to version 7.0.2
1 parent e332757 commit dd45b68

File tree

6 files changed

+50
-10
lines changed

6 files changed

+50
-10
lines changed

build.gradle

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -516,14 +516,10 @@ subprojects {
516516
dependency 'org.spdx:java-spdx-library:2.0.2'
517517
dependency 'org.spdx:spdx-v3jsonld-store:1.0.1'
518518
dependency 'org.spdx:spdx-jackson-store:2.0.3'
519-
dependencySet(group: 'org.springframework', version: '6.2.12') {
519+
dependencySet(group: 'org.springframework', version: '7.0.2') {
520520
entry 'spring-test'
521-
entry('spring-context') {
522-
exclude 'commons-logging:commons-logging'
523-
}
524-
entry('spring-webmvc') {
525-
exclude 'commons-logging:commons-logging'
526-
}
521+
entry 'spring-context'
522+
entry 'spring-webmvc'
527523
}
528524
dependency "org.springframework.security:spring-security-saml2-service-provider:${springSecurityVersion}"
529525
dependency 'org.mybatis:mybatis:3.5.19'

server/sonar-spring/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
plugins {
2+
id 'java-test-fixtures'
3+
}
4+
15
description = 'SonarQube Spring shared configuration and utilities'
26

37
sonar {

server/sonar-spring/src/main/java/org/sonar/server/v2/config/CommonWebConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class CommonWebConfig implements WebMvcConfigurer {
4040
public void configurePathMatch(PathMatchConfigurer configurer) {
4141
UrlPathHelper urlPathHelper = new UrlPathHelper();
4242
urlPathHelper.setUrlDecode(false);
43-
configurer.setUrlPathHelper(urlPathHelper).setUseTrailingSlashMatch(true);
43+
configurer.setUrlPathHelper(urlPathHelper);
4444
}
4545

4646
@Override

server/sonar-spring/src/testFixtures/java/org/sonar/server/v2/api/ControllerTester.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,22 @@
1919
*/
2020
package org.sonar.server.v2.api;
2121

22+
import jakarta.servlet.FilterChain;
23+
import jakarta.servlet.ServletException;
24+
import jakarta.servlet.http.HttpServletRequest;
25+
import jakarta.servlet.http.HttpServletResponse;
2226
import jakarta.validation.Validation;
2327
import jakarta.validation.ValidatorFactory;
28+
import java.io.IOException;
2429
import java.util.List;
2530
import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator;
31+
import org.jspecify.annotations.NonNull;
2632
import org.sonar.server.v2.common.RestResponseEntityExceptionHandler;
2733
import org.springframework.test.web.servlet.MockMvc;
2834
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
2935
import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
36+
import org.springframework.web.filter.OncePerRequestFilter;
37+
import org.springframework.web.filter.UrlHandlerFilter;
3038
import org.springframework.web.servlet.HandlerInterceptor;
3139
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
3240

@@ -45,7 +53,7 @@ public static MockMvc getMockMvcWithHandlerInterceptors(List<HandlerInterceptor>
4553
.setValidator(new SpringValidatorAdapter(validatorFactory.getValidator()))
4654
.setCustomHandlerMapping(() -> resolveRequestMappingHandlerMapping(handlerInterceptors))
4755
.setControllerAdvice(new RestResponseEntityExceptionHandler())
48-
.setUseTrailingSlashPatternMatch(true)
56+
.addFilter(new TrailingSlashHandlerFilter())
4957
.build();
5058
}
5159

@@ -54,6 +62,21 @@ private static RequestMappingHandlerMapping resolveRequestMappingHandlerMapping(
5462
handlerMapping.setInterceptors(handlerInterceptors != null ? handlerInterceptors.toArray() : new Object[0]);
5563
return handlerMapping;
5664
}
65+
66+
/**
67+
* Replace deprecated {@link org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder#setUseTrailingShashPatternMatch()}
68+
*/
69+
private static class TrailingSlashHandlerFilter extends OncePerRequestFilter {
70+
@Override
71+
72+
protected void doFilterInternal(
73+
@NonNull HttpServletRequest request,
74+
@NonNull HttpServletResponse response,
75+
@NonNull FilterChain filterChain) throws ServletException, IOException {
76+
UrlHandlerFilter filter = UrlHandlerFilter.trailingSlashHandler("/**").wrapRequest().build();
77+
filter.doFilter(request, response, filterChain);
78+
}
79+
}
5780
}
5881

5982

server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/group/controller/GroupController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public interface GroupController {
6464
""")
6565
GroupsSearchRestResponse search(
6666
@Valid @ParameterObject GroupsSearchRestRequest groupsSearchRestRequest,
67-
@RequestParam(name = "userId!") @Nullable @Schema(description = "Find groups without this user. Only available for system administrators.",
67+
@RequestParam(name = "userId!", required = false) @Nullable @Schema(description = "Find groups without this user. Only available for system administrators.",
6868
extensions = @Extension(properties = {@ExtensionProperty(name = "internal", value = "true")}), hidden = true) String excludedUserId,
6969
@Valid @ParameterObject RestPage restPage);
7070

server/sonar-webserver/src/main/java/org/sonar/server/platform/PlatformImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@
4343
import org.sonar.server.platform.platformlevel.PlatformLevelStartup;
4444
import org.sonar.server.platform.web.ApiV2Servlet;
4545

46+
import static jakarta.servlet.DispatcherType.ASYNC;
47+
import static jakarta.servlet.DispatcherType.ERROR;
48+
import static jakarta.servlet.DispatcherType.REQUEST;
4649
import static org.sonar.process.ProcessId.WEB_SERVER;
50+
import static org.springframework.web.filter.UrlHandlerFilter.trailingSlashHandler;
4751

4852
/**
4953
* @since 2.2
@@ -136,6 +140,19 @@ private void registerSpringMvcServlet() {
136140
ServletRegistration.Dynamic app = this.servletContext.addServlet("app", servlet);
137141
app.addMapping("/api/v2/*");
138142
app.setLoadOnStartup(1);
143+
registerTrailingSlashFilter();
144+
}
145+
146+
private void registerTrailingSlashFilter() {
147+
var filter = trailingSlashHandler("/api/v2/**")
148+
.wrapRequest()
149+
.build();
150+
var filterRegistration = this.servletContext.addFilter("trailingSlashFilter", filter);
151+
filterRegistration.addMappingForUrlPatterns(
152+
java.util.EnumSet.of(REQUEST, ERROR, ASYNC),
153+
false,
154+
"/api/v2/*"
155+
);
139156
}
140157

141158
private AutoStarter createAutoStarter() {

0 commit comments

Comments
 (0)