diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/NoResourceFoundException.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/NoResourceFoundException.java index aa59dae0a0..4f4ab4cc82 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/NoResourceFoundException.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/NoResourceFoundException.java @@ -16,6 +16,8 @@ package org.springframework.web.reactive.resource; +import java.net.URI; + import org.springframework.http.HttpStatus; import org.springframework.web.server.ResponseStatusException; @@ -30,9 +32,9 @@ import org.springframework.web.server.ResponseStatusException; public class NoResourceFoundException extends ResponseStatusException { - public NoResourceFoundException(String resourcePath) { - super(HttpStatus.NOT_FOUND, "No static resource " + resourcePath + "."); - setDetail(getReason()); + public NoResourceFoundException(URI uri, String resourcePath) { + super(HttpStatus.NOT_FOUND, "No static resource " + resourcePath + " for request '" + uri + "'."); + setDetail("No static resource " + resourcePath + "."); } } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java index d62bec9271..3704dcb8d0 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java @@ -420,7 +420,7 @@ public class ResourceWebHandler implements WebHandler, InitializingBean { if (logger.isDebugEnabled()) { logger.debug(exchange.getLogPrefix() + "Resource not found"); } - return Mono.error(new NoResourceFoundException(getResourcePath(exchange))); + return Mono.error(new NoResourceFoundException(exchange.getRequest().getURI(), getResourcePath(exchange))); })) .flatMap(resource -> { try { diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/resource/NoResourceFoundExceptionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/NoResourceFoundExceptionTests.java new file mode 100644 index 0000000000..38ef980068 --- /dev/null +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/resource/NoResourceFoundExceptionTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2002-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.web.reactive.resource; + +import java.net.URI; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link NoResourceFoundException}. + * @author Brian Clozel + */ +class NoResourceFoundExceptionTests { + + @Test + void messageShouldContainRequestUriAndResourcePath() { + var noResourceFoundException = new NoResourceFoundException(URI.create("/context/resource"), "/resource"); + assertThat(noResourceFoundException.getMessage()).isEqualTo("404 NOT_FOUND \"No static resource /resource for request '/context/resource'.\""); + } + + @Test + void detailShouldContainResourcePath() { + var noResourceFoundException = new NoResourceFoundException(URI.create("/context/resource"), "/resource"); + assertThat(noResourceFoundException.getBody().getDetail()).isEqualTo("No static resource /resource."); + } + +} diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/NoResourceFoundException.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/NoResourceFoundException.java index 9e791269da..593e33ef73 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/NoResourceFoundException.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/NoResourceFoundException.java @@ -45,11 +45,11 @@ public class NoResourceFoundException extends ServletException implements ErrorR /** * Create an instance. */ - public NoResourceFoundException(HttpMethod httpMethod, String resourcePath) { - super("No static resource " + resourcePath + "."); + public NoResourceFoundException(HttpMethod httpMethod, String requestUri, String resourcePath) { + super("No static resource " + resourcePath + " for request '" + requestUri + "'."); this.httpMethod = httpMethod; this.resourcePath = resourcePath; - this.body = ProblemDetail.forStatusAndDetail(getStatusCode(), getMessage()); + this.body = ProblemDetail.forStatusAndDetail(getStatusCode(), "No static resource " + resourcePath + "."); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java index a89edd5c33..8949b91d41 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java @@ -524,7 +524,7 @@ public class ResourceHttpRequestHandler extends WebContentGenerator Resource resource = getResource(request); if (resource == null) { logger.debug("Resource not found"); - throw new NoResourceFoundException(HttpMethod.valueOf(request.getMethod()), getPath(request)); + throw new NoResourceFoundException(HttpMethod.valueOf(request.getMethod()), request.getRequestURI(), getPath(request)); } if (HttpMethod.OPTIONS.matches(request.getMethod())) { diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java index 81378a9921..46bc91fd61 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java @@ -306,7 +306,7 @@ class ResponseEntityExceptionHandlerTests { @Test void noResourceFoundException() { - testException(new NoResourceFoundException(HttpMethod.GET, "/resource")); + testException(new NoResourceFoundException(HttpMethod.GET, "/context/resource", "/resource")); } @Test diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolverTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolverTests.java index 3221ccfeea..bfd81a2386 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolverTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolverTests.java @@ -209,7 +209,7 @@ class DefaultHandlerExceptionResolverTests { @Test void handleNoResourceFoundException() { - NoResourceFoundException ex = new NoResourceFoundException(HttpMethod.GET, "/resource"); + NoResourceFoundException ex = new NoResourceFoundException(HttpMethod.GET, "/context/resource", "/resource"); ModelAndView mav = exceptionResolver.resolveException(request, response, null, ex); assertThat(mav).as("No ModelAndView returned").isNotNull(); assertThat(mav.isEmpty()).as("No Empty ModelAndView returned").isTrue(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/NoResourceFoundExceptionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/NoResourceFoundExceptionTests.java new file mode 100644 index 0000000000..56cf687c1f --- /dev/null +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/NoResourceFoundExceptionTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2002-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.web.servlet.resource; + +import org.junit.jupiter.api.Test; + +import org.springframework.http.HttpMethod; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link NoResourceFoundException}. + * @author Brian Clozel + */ +class NoResourceFoundExceptionTests { + + @Test + void messageShouldContainRequestUriAndResourcePath() { + var noResourceFoundException = new NoResourceFoundException(HttpMethod.GET, "/context/resource", "/resource"); + assertThat(noResourceFoundException.getMessage()).isEqualTo("No static resource /resource for request '/context/resource'."); + } + + @Test + void detailShouldContainResourcePath() { + var noResourceFoundException = new NoResourceFoundException(HttpMethod.GET, "/context/resource", "/resource"); + assertThat(noResourceFoundException.getBody().getDetail()).isEqualTo("No static resource /resource."); + } + +}