Browse Source

Use MethodInvocationInfo class loader in case of JDK platform loader as well

Closes gh-30210

(cherry picked from commit 491ae1e3be)
pull/30257/head
Juergen Hoeller 3 years ago
parent
commit
7ad01a94d6
  1. 4
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java
  2. 42
      spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java

4
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java

@ -777,7 +777,9 @@ public class MvcUriComponentsBuilder { @@ -777,7 +777,9 @@ public class MvcUriComponentsBuilder {
else if (controllerType.isInterface()) {
ClassLoader classLoader = controllerType.getClassLoader();
if (classLoader == null) { // JDK interface type from bootstrap loader
if (classLoader == null || classLoader.getParent() == null) {
// JDK interface type from bootstrap loader or platform loader ->
// use higher-level loader which can see Spring infrastructure classes
classLoader = MethodInvocationInfo.class.getClassLoader();
}
Class<?>[] ifcs = new Class<?>[] {controllerType, MethodInvocationInfo.class};

42
spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java

@ -21,6 +21,7 @@ import java.lang.annotation.ElementType; @@ -21,6 +21,7 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.sql.Savepoint;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@ -378,14 +379,6 @@ public class MvcUriComponentsBuilderTests { @@ -378,14 +379,6 @@ public class MvcUriComponentsBuilderTests {
assertThat(uriComponents.encode().toUri().toString()).isEqualTo("http://localhost/hotels/42/bookings/21");
}
@Test // SPR-16710
public void fromMethodCallWithCharSequenceReturnType() {
UriComponents uriComponents = fromMethodCall(
on(BookingControllerWithCharSequence.class).getBooking(21L)).buildAndExpand(42);
assertThat(uriComponents.encode().toUri().toString()).isEqualTo("http://localhost/hotels/42/bookings/21");
}
@Test // SPR-16710
public void fromMethodCallWithStringReturnType() {
assertThatIllegalStateException().isThrownBy(() -> {
@ -403,6 +396,22 @@ public class MvcUriComponentsBuilderTests { @@ -403,6 +396,22 @@ public class MvcUriComponentsBuilderTests {
assertThat(uriComponents.encode().toUri().toString()).isEqualTo("http://localhost/hotels/42/bookings/21");
}
@Test // gh-30210
public void fromMethodCallWithCharSequenceReturnType() {
UriComponents uriComponents = fromMethodCall(
on(BookingControllerWithCharSequence.class).getBooking(21L)).buildAndExpand(42);
assertThat(uriComponents.encode().toUri().toString()).isEqualTo("http://localhost/hotels/42/bookings/21");
}
@Test // gh-30210
public void fromMethodCallWithJdbc30115ReturnType() {
UriComponents uriComponents = fromMethodCall(
on(BookingControllerWithJdbcSavepoint.class).getBooking(21L)).buildAndExpand(42);
assertThat(uriComponents.encode().toUri().toString()).isEqualTo("http://localhost/hotels/42/bookings/21");
}
@Test
public void fromMappingNamePlain() {
initWebApplicationContext(WebConfig.class);
@ -693,6 +702,17 @@ public class MvcUriComponentsBuilderTests { @@ -693,6 +702,17 @@ public class MvcUriComponentsBuilderTests {
}
@Controller
@RequestMapping("/hotels/{hotel}")
static class BookingControllerWithString {
@GetMapping("/bookings/{booking}")
public String getBooking(@PathVariable Long booking) {
return "url";
}
}
@Controller
@RequestMapping("/hotels/{hotel}")
static class BookingControllerWithCharSequence {
@ -706,11 +726,11 @@ public class MvcUriComponentsBuilderTests { @@ -706,11 +726,11 @@ public class MvcUriComponentsBuilderTests {
@Controller
@RequestMapping("/hotels/{hotel}")
static class BookingControllerWithString {
static class BookingControllerWithJdbcSavepoint {
@GetMapping("/bookings/{booking}")
public String getBooking(@PathVariable Long booking) {
return "url";
public Savepoint getBooking(@PathVariable Long booking) {
return null;
}
}

Loading…
Cancel
Save