refactor: 优化对application/x-ndjson的支持

This commit is contained in:
zhouhao
2024-07-16 18:51:38 +08:00
parent a5e73bfd62
commit 47b7ed9181
2 changed files with 26 additions and 18 deletions

View File

@@ -37,7 +37,7 @@ public class ResponseMessageWrapper extends ResponseBodyResultHandler {
static {
try {
param = new MethodParameter(ResponseMessageWrapper.class
.getDeclaredMethod("methodForParams"), -1);
.getDeclaredMethod("methodForParams"), -1);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
@@ -69,24 +69,24 @@ public class ResponseMessageWrapper extends ResponseBodyResultHandler {
boolean isAlreadyResponse = gen == ResponseMessage.class || gen == ResponseEntity.class;
boolean isStream = result.getReturnType().resolve() == Mono.class
|| result.getReturnType().resolve() == Flux.class;
|| result.getReturnType().resolve() == Flux.class;
RequestMapping mapping = result.getReturnTypeSource()
.getMethodAnnotation(RequestMapping.class);
.getMethodAnnotation(RequestMapping.class);
if (mapping == null) {
return false;
}
for (String produce : mapping.produces()) {
MimeType mimeType = MimeType.valueOf(produce);
if (MediaType.TEXT_EVENT_STREAM.includes(mimeType) ||
MediaType.APPLICATION_STREAM_JSON.includes(mimeType)) {
MediaType.APPLICATION_NDJSON.includes(mimeType)) {
return false;
}
}
return isStream
&& super.supports(result)
&& !isAlreadyResponse;
&& super.supports(result)
&& !isAlreadyResponse;
}
@Override
@@ -94,24 +94,31 @@ public class ResponseMessageWrapper extends ResponseBodyResultHandler {
public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) {
Object body = result.getReturnValue();
if (exchange
.getRequest()
.getHeaders()
.getAccept()
.contains(MediaType.TEXT_EVENT_STREAM)) {
return writeBody(body, param, exchange);
List<MediaType> accept = exchange.getRequest().getHeaders().getAccept();
if (accept.contains(MediaType.TEXT_EVENT_STREAM)||
accept.contains(MediaType.APPLICATION_NDJSON)) {
return writeBody(body, result.getReturnTypeSource(), exchange);
}
String ignoreWrapper = exchange
.getRequest()
.getHeaders()
.getFirst("X-Response-Wrapper");
if ("Ignore".equals(ignoreWrapper)) {
return writeBody(body, result.getReturnTypeSource(), exchange);
}
if (body instanceof Mono) {
body = ((Mono) body)
.map(ResponseMessage::ok)
.switchIfEmpty(Mono.just(ResponseMessage.ok()));
.map(ResponseMessage::ok)
.switchIfEmpty(Mono.just(ResponseMessage.ok()));
}
if (body instanceof Flux) {
body = ((Flux) body)
.collectList()
.map(ResponseMessage::ok)
.switchIfEmpty(Mono.just(ResponseMessage.ok()));
.collectList()
.map(ResponseMessage::ok)
.switchIfEmpty(Mono.just(ResponseMessage.ok()));
}
if (body == null) {

View File

@@ -56,7 +56,7 @@ public class CustomJackson2jsonEncoder extends Jackson2CodecSupport implements H
static {
STREAM_SEPARATORS = new HashMap<>(4);
STREAM_SEPARATORS.put(MediaType.APPLICATION_STREAM_JSON, NEWLINE_SEPARATOR);
STREAM_SEPARATORS.put(MediaType.APPLICATION_NDJSON, NEWLINE_SEPARATOR);
STREAM_SEPARATORS.put(MediaType.parseMediaType("application/stream+x-jackson-smile"), new byte[0]);
ENCODINGS = new HashMap<>(JsonEncoding.values().length + 1);
@@ -75,6 +75,7 @@ public class CustomJackson2jsonEncoder extends Jackson2CodecSupport implements H
*/
protected CustomJackson2jsonEncoder(ObjectMapper mapper, MimeType... mimeTypes) {
super(mapper, mimeTypes);
streamingMediaTypes.add(MediaType.APPLICATION_NDJSON);
}