@Bean public ResponseBodyResultHandler responseBodyResultHandler() { return new ResponseBodyResultHandler(serverCodecConfigurer().getWriters(), webFluxContentTypeResolver(), webFluxAdapterRegistry()); }
/** * Constructor with an {@link ReactiveAdapterRegistry} instance. * @param writers writers for serializing to the response body * @param resolver to determine the requested content type * @param registry for adaptation to reactive types */ public ResponseBodyResultHandler(List<HttpMessageWriter<?>> writers, RequestedContentTypeResolver resolver, ReactiveAdapterRegistry registry) { super(writers, resolver, registry); setOrder(100); }
@Override public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) { Object body = result.getReturnValue(); MethodParameter bodyTypeParameter = result.getReturnTypeSource(); return writeBody(body, bodyTypeParameter, exchange); }
@Test public void responseBodyResultHandler() throws Exception { ApplicationContext context = loadConfig(WebFluxConfig.class); String name = "responseBodyResultHandler"; ResponseBodyResultHandler handler = context.getBean(name, ResponseBodyResultHandler.class); assertNotNull(handler); assertEquals(100, handler.getOrder()); List<HttpMessageWriter<?>> writers = handler.getMessageWriters(); assertEquals(11, writers.size()); assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM); assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM); assertHasMessageWriter(writers, forClass(String.class), TEXT_PLAIN); assertHasMessageWriter(writers, forClass(Resource.class), IMAGE_PNG); assertHasMessageWriter(writers, forClass(Message.class), new MediaType("application", "x-protobuf")); assertHasMessageWriter(writers, forClass(TestBean.class), APPLICATION_XML); assertHasMessageWriter(writers, forClass(TestBean.class), APPLICATION_JSON); assertHasMessageWriter(writers, forClass(TestBean.class), new MediaType("application", "x-jackson-smile")); assertHasMessageWriter(writers, forClass(TestBean.class), null); name = "webFluxContentTypeResolver"; RequestedContentTypeResolver resolver = context.getBean(name, RequestedContentTypeResolver.class); assertSame(resolver, handler.getContentTypeResolver()); }
@Override public boolean supports(HandlerResult result) { MethodParameter parameter = result.getReturnTypeSource(); return hasResponseBodyAnnotation(parameter) && !isHttpEntityType(result); }
@Test public void defaultOrder() throws Exception { assertEquals(100, this.resultHandler.getOrder()); }
private boolean isHttpEntityType(HandlerResult result) { Class<?> rawClass = result.getReturnType().getRawClass(); if (HttpEntity.class.isAssignableFrom(rawClass)) { return true; } else { ReactiveAdapter adapter = getAdapterRegistry().getAdapter(rawClass, result.getReturnValue()); if (adapter != null && !adapter.isNoValue()) { ResolvableType genericType = result.getReturnType().getGeneric(0); if (HttpEntity.class.isAssignableFrom(genericType.getRawClass())) { return true; } } } return false; }
@Bean public ResponseBodyResultHandler resultHandler() { return new ResponseBodyResultHandler(Collections.singletonList( new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly())), new HeaderContentTypeResolver()); }
/** * Constructor with an additional {@link ReactiveAdapterRegistry}. * * @param messageWriters writers for serializing to the response body stream * @param contentTypeResolver for resolving the requested content type * @param adapterRegistry for adapting other reactive types (e.g. rx.Observable, * rx.Single, etc.) to Flux or Mono */ public ResponseBodyResultHandler(List<HttpMessageWriter<?>> messageWriters, RequestedContentTypeResolver contentTypeResolver, ReactiveAdapterRegistry adapterRegistry) { super(messageWriters, contentTypeResolver, adapterRegistry); setOrder(100); }
@Override public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) { Object body = result.getReturnValue().orElse(null); MethodParameter bodyTypeParameter = result.getReturnTypeSource(); return writeBody(body, bodyTypeParameter, exchange); }
@Before public void setup() throws Exception { List<HttpMessageWriter<?>> writerList = new ArrayList<>(5); writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder())); writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes())); writerList.add(new ResourceHttpMessageWriter()); writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder())); writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder())); RequestedContentTypeResolver resolver = new RequestedContentTypeResolverBuilder().build(); this.resultHandler = new ResponseBodyResultHandler(writerList, resolver); }
@Bean public ResponseBodyResultHandler responseBodyResultHandler() { return new ResponseBodyResultHandler( getMessageWriters(), webReactiveContentTypeResolver(), webReactiveAdapterRegistry()); }