commit
c3ed545ffd
|
@ -30,6 +30,7 @@ import org.springframework.boot.autoconfigure.web.ErrorProperties;
|
||||||
import org.springframework.boot.autoconfigure.web.WebProperties.Resources;
|
import org.springframework.boot.autoconfigure.web.WebProperties.Resources;
|
||||||
import org.springframework.boot.web.error.ErrorAttributeOptions;
|
import org.springframework.boot.web.error.ErrorAttributeOptions;
|
||||||
import org.springframework.boot.web.error.ErrorAttributeOptions.Include;
|
import org.springframework.boot.web.error.ErrorAttributeOptions.Include;
|
||||||
|
import org.springframework.boot.web.reactive.error.DefaultErrorAttributes;
|
||||||
import org.springframework.boot.web.reactive.error.ErrorAttributes;
|
import org.springframework.boot.web.reactive.error.ErrorAttributes;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
|
@ -94,6 +95,8 @@ public class DefaultErrorWebExceptionHandler extends AbstractErrorWebExceptionHa
|
||||||
|
|
||||||
private static final ErrorAttributeOptions ONLY_STATUS = ErrorAttributeOptions.of(Include.STATUS);
|
private static final ErrorAttributeOptions ONLY_STATUS = ErrorAttributeOptions.of(Include.STATUS);
|
||||||
|
|
||||||
|
private static final DefaultErrorAttributes defaultErrorAttributes = new DefaultErrorAttributes();
|
||||||
|
|
||||||
private final ErrorProperties errorProperties;
|
private final ErrorProperties errorProperties;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,8 +124,8 @@ public class DefaultErrorWebExceptionHandler extends AbstractErrorWebExceptionHa
|
||||||
* @return a {@code Publisher} of the HTTP response
|
* @return a {@code Publisher} of the HTTP response
|
||||||
*/
|
*/
|
||||||
protected Mono<ServerResponse> renderErrorView(ServerRequest request) {
|
protected Mono<ServerResponse> renderErrorView(ServerRequest request) {
|
||||||
int status = getHttpStatus(getErrorAttributes(request, ONLY_STATUS));
|
|
||||||
Map<String, Object> errorAttributes = getErrorAttributes(request, MediaType.TEXT_HTML);
|
Map<String, Object> errorAttributes = getErrorAttributes(request, MediaType.TEXT_HTML);
|
||||||
|
int status = getHttpStatus(request, errorAttributes);
|
||||||
ServerResponse.BodyBuilder responseBody = ServerResponse.status(status).contentType(TEXT_HTML_UTF8);
|
ServerResponse.BodyBuilder responseBody = ServerResponse.status(status).contentType(TEXT_HTML_UTF8);
|
||||||
return Flux.just(getData(status).toArray(new String[] {}))
|
return Flux.just(getData(status).toArray(new String[] {}))
|
||||||
.flatMap((viewName) -> renderErrorView(viewName, responseBody, errorAttributes))
|
.flatMap((viewName) -> renderErrorView(viewName, responseBody, errorAttributes))
|
||||||
|
@ -148,8 +151,8 @@ public class DefaultErrorWebExceptionHandler extends AbstractErrorWebExceptionHa
|
||||||
* @return a {@code Publisher} of the HTTP response
|
* @return a {@code Publisher} of the HTTP response
|
||||||
*/
|
*/
|
||||||
protected Mono<ServerResponse> renderErrorResponse(ServerRequest request) {
|
protected Mono<ServerResponse> renderErrorResponse(ServerRequest request) {
|
||||||
int status = getHttpStatus(getErrorAttributes(request, ONLY_STATUS));
|
|
||||||
Map<String, Object> errorAttributes = getErrorAttributes(request, MediaType.ALL);
|
Map<String, Object> errorAttributes = getErrorAttributes(request, MediaType.ALL);
|
||||||
|
int status = getHttpStatus(request, errorAttributes);
|
||||||
return ServerResponse.status(status)
|
return ServerResponse.status(status)
|
||||||
.contentType(MediaType.APPLICATION_JSON)
|
.contentType(MediaType.APPLICATION_JSON)
|
||||||
.body(BodyInserters.fromValue(errorAttributes));
|
.body(BodyInserters.fromValue(errorAttributes));
|
||||||
|
@ -234,6 +237,11 @@ public class DefaultErrorWebExceptionHandler extends AbstractErrorWebExceptionHa
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getHttpStatus(ServerRequest request, Map<String, Object> errorAttributes) {
|
||||||
|
return getHttpStatus(errorAttributes.containsKey("status") ? errorAttributes
|
||||||
|
: defaultErrorAttributes.getErrorAttributes(request, ONLY_STATUS));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the HTTP error status information from the error map.
|
* Get the HTTP error status information from the error map.
|
||||||
* @param errorAttributes the current error information
|
* @param errorAttributes the current error information
|
||||||
|
|
|
@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.web.reactive.error;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
@ -597,6 +598,21 @@ class DefaultErrorWebExceptionHandlerIntegrationTests {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void customErrorAttributesWithoutStatus() {
|
||||||
|
this.contextRunner.withUserConfiguration(CustomErrorAttributesWithoutStatus.class).run((context) -> {
|
||||||
|
WebTestClient client = getWebClient(context);
|
||||||
|
client.get()
|
||||||
|
.uri("/badRequest")
|
||||||
|
.exchange()
|
||||||
|
.expectStatus()
|
||||||
|
.isBadRequest()
|
||||||
|
.expectBody()
|
||||||
|
.jsonPath("status")
|
||||||
|
.doesNotExist();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private String getErrorTemplatesLocation() {
|
private String getErrorTemplatesLocation() {
|
||||||
String packageName = getClass().getPackage().getName();
|
String packageName = getClass().getPackage().getName();
|
||||||
return "classpath:/" + packageName.replace('.', '/') + "/templates/";
|
return "classpath:/" + packageName.replace('.', '/') + "/templates/";
|
||||||
|
@ -686,6 +702,7 @@ class DefaultErrorWebExceptionHandlerIntegrationTests {
|
||||||
@Bean
|
@Bean
|
||||||
ErrorAttributes errorAttributes() {
|
ErrorAttributes errorAttributes() {
|
||||||
return new DefaultErrorAttributes() {
|
return new DefaultErrorAttributes() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
|
public Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
|
||||||
Map<String, Object> errorAttributes = new HashMap<>();
|
Map<String, Object> errorAttributes = new HashMap<>();
|
||||||
|
@ -724,4 +741,23 @@ class DefaultErrorWebExceptionHandlerIntegrationTests {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Configuration(proxyBeanMethods = false)
|
||||||
|
static class CustomErrorAttributesWithoutStatus {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
ErrorAttributes errorAttributes() {
|
||||||
|
return new DefaultErrorAttributes() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {
|
||||||
|
Map<String, Object> attributes = new LinkedHashMap<>(super.getErrorAttributes(request, options));
|
||||||
|
attributes.remove("status");
|
||||||
|
return attributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,7 +173,7 @@ public enum TestImage {
|
||||||
/**
|
/**
|
||||||
* A container image suitable for testing Pulsar.
|
* A container image suitable for testing Pulsar.
|
||||||
*/
|
*/
|
||||||
PULSAR("apachepulsar/pulsar", "3.2.0", () -> PulsarContainer.class,
|
PULSAR("apachepulsar/pulsar", "3.2.4", () -> PulsarContainer.class,
|
||||||
(container) -> ((PulsarContainer) container).withStartupAttempts(2)
|
(container) -> ((PulsarContainer) container).withStartupAttempts(2)
|
||||||
.withStartupTimeout(Duration.ofMinutes(3))),
|
.withStartupTimeout(Duration.ofMinutes(3))),
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue