|
@@ -2,11 +2,16 @@ package org.hswebframework.web.crud.web;
|
|
|
|
|
|
import org.springframework.core.MethodParameter;
|
|
import org.springframework.core.MethodParameter;
|
|
import org.springframework.core.ReactiveAdapterRegistry;
|
|
import org.springframework.core.ReactiveAdapterRegistry;
|
|
|
|
+import org.springframework.http.MediaType;
|
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
import org.springframework.http.codec.HttpMessageWriter;
|
|
import org.springframework.http.codec.HttpMessageWriter;
|
|
|
|
+import org.springframework.util.MimeType;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
import org.springframework.web.reactive.HandlerResult;
|
|
import org.springframework.web.reactive.HandlerResult;
|
|
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
|
|
import org.springframework.web.reactive.accept.RequestedContentTypeResolver;
|
|
import org.springframework.web.reactive.result.method.annotation.ResponseBodyResultHandler;
|
|
import org.springframework.web.reactive.result.method.annotation.ResponseBodyResultHandler;
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
|
|
+import reactor.core.publisher.Flux;
|
|
import reactor.core.publisher.Mono;
|
|
import reactor.core.publisher.Mono;
|
|
|
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
@@ -34,20 +39,54 @@ public class ResponseMessageWrapper extends ResponseBodyResultHandler {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public boolean supports(HandlerResult result) {
|
|
public boolean supports(HandlerResult result) {
|
|
- boolean isAlreadyResponse = result.getReturnType().resolveGeneric(0) == ResponseMessage.class;
|
|
|
|
- boolean isMono = result.getReturnType().resolve() == Mono.class;
|
|
|
|
- return isMono && super.supports(result) && !isAlreadyResponse;
|
|
|
|
|
|
+ Class gen = result.getReturnType().resolveGeneric(0);
|
|
|
|
+
|
|
|
|
+ boolean isAlreadyResponse = gen == ResponseMessage.class || gen == ResponseEntity.class;
|
|
|
|
+
|
|
|
|
+ boolean isStream = result.getReturnType().resolve() == Mono.class
|
|
|
|
+ || result.getReturnType().resolve() == Flux.class;
|
|
|
|
+
|
|
|
|
+ RequestMapping mapping = result.getReturnTypeSource()
|
|
|
|
+ .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)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return isStream
|
|
|
|
+ && super.supports(result)
|
|
|
|
+ && !isAlreadyResponse;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@SuppressWarnings("all")
|
|
@SuppressWarnings("all")
|
|
public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) {
|
|
public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) {
|
|
Object body = result.getReturnValue();
|
|
Object body = result.getReturnValue();
|
|
|
|
+
|
|
|
|
+ if (exchange
|
|
|
|
+ .getRequest()
|
|
|
|
+ .getHeaders()
|
|
|
|
+ .getAccept()
|
|
|
|
+ .contains(MediaType.TEXT_EVENT_STREAM)) {
|
|
|
|
+ return writeBody(body, param, exchange);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (body instanceof Mono) {
|
|
if (body instanceof Mono) {
|
|
body = ((Mono) body)
|
|
body = ((Mono) body)
|
|
.switchIfEmpty(Mono.just(ResponseMessage.ok()))
|
|
.switchIfEmpty(Mono.just(ResponseMessage.ok()))
|
|
.map(ResponseMessage::ok);
|
|
.map(ResponseMessage::ok);
|
|
}
|
|
}
|
|
|
|
+ if (body instanceof Flux) {
|
|
|
|
+ body = ((Flux) body)
|
|
|
|
+ .collectList()
|
|
|
|
+ .switchIfEmpty(Mono.just(ResponseMessage.ok()))
|
|
|
|
+ .map(ResponseMessage::ok);
|
|
|
|
+ }
|
|
if (body == null) {
|
|
if (body == null) {
|
|
body = Mono.just(ResponseMessage.ok());
|
|
body = Mono.just(ResponseMessage.ok());
|
|
}
|
|
}
|