From 39ca7952b9539386d8f268529059890b71dea7c1 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 25 Apr 2017 08:41:02 +0100 Subject: [PATCH] Fix some tests There is one behaviour change (you have to POST an array to a function endpoint if you are sending a body), and also a message converter that needed to be removed so that arrays are not toStringed in the response body. --- ...ntextFunctionCatalogAutoConfiguration.java | 138 ++++++++++-------- .../com/example/SampleApplicationTests.java | 4 +- .../com/example/SampleApplicationTests.java | 6 +- .../web/flux/ReactorAutoConfiguration.java | 7 - 4 files changed, 80 insertions(+), 75 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java index 90fc4fd11..3595fd3c5 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfiguration.java @@ -92,7 +92,7 @@ public class ContextFunctionCatalogAutoConfiguration { public FunctionInspector functionInspector(ContextFunctionPostProcessor processor) { return new BeanFactoryFunctionInspector(processor); } - + protected class BeanFactoryFunctionInspector implements FunctionInspector { private ContextFunctionPostProcessor processor; @@ -100,12 +100,12 @@ public class ContextFunctionCatalogAutoConfiguration { public BeanFactoryFunctionInspector(ContextFunctionPostProcessor processor) { this.processor = processor; } - + @Override public Class getInputType(String name) { return processor.findInputType(name); } - + @Override public Class getOutputType(String name) { return processor.findOutputType(name); @@ -115,12 +115,12 @@ public class ContextFunctionCatalogAutoConfiguration { public Object convert(String name, String value) { return processor.convert(name, value); } - + @Override public String getName(Object function) { return processor.registrations.get(function); } - + } @Component @@ -141,9 +141,10 @@ public class ContextFunctionCatalogAutoConfiguration { } public Object convert(String name, String value) { - if (conversionService==null) { + if (conversionService == null) { if (registry instanceof ConfigurableListableBeanFactory) { - ConversionService conversionService = ((ConfigurableBeanFactory) this.registry).getConversionService(); + ConversionService conversionService = ((ConfigurableBeanFactory) this.registry) + .getConversionService(); if (conversionService != null) { this.conversionService = conversionService; } @@ -153,7 +154,8 @@ public class ContextFunctionCatalogAutoConfiguration { } } Class type = findInputType(name); - return conversionService.canConvert(String.class, type) ? conversionService.convert(value, type) : value; + return conversionService.canConvert(String.class, type) + ? conversionService.convert(value, type) : value; } public Set> merge( @@ -395,68 +397,78 @@ public class ContextFunctionCatalogAutoConfiguration { } private Class findType(AbstractBeanDefinition definition, int index) { - Object source = definition.getSource(); - Type param; - if (source instanceof StandardMethodMetadata) { - ParameterizedType type; - type = (ParameterizedType) ((StandardMethodMetadata) source).getIntrospectedMethod() - .getGenericReturnType(); - Type typeArgumentAtIndex = type.getActualTypeArguments()[index]; - if (typeArgumentAtIndex instanceof ParameterizedType) { - param = ((ParameterizedType) typeArgumentAtIndex).getActualTypeArguments()[0]; - } - else { - param = typeArgumentAtIndex; - } - } - else if (source instanceof FileSystemResource) { - try { - Type type = ClassUtils.forName(definition.getBeanClassName(), null); - if (type instanceof ParameterizedType) { - Type typeArgumentAtIndex = ((ParameterizedType)type).getActualTypeArguments()[index]; - if (typeArgumentAtIndex instanceof ParameterizedType) { - param = ((ParameterizedType) typeArgumentAtIndex).getActualTypeArguments()[0]; - } else { - param = typeArgumentAtIndex; - } + Object source = definition.getSource(); + Type param; + if (source instanceof StandardMethodMetadata) { + ParameterizedType type; + type = (ParameterizedType) ((StandardMethodMetadata) source) + .getIntrospectedMethod().getGenericReturnType(); + Type typeArgumentAtIndex = type.getActualTypeArguments()[index]; + if (typeArgumentAtIndex instanceof ParameterizedType) { + param = ((ParameterizedType) typeArgumentAtIndex) + .getActualTypeArguments()[0]; } else { - param = type; + param = typeArgumentAtIndex; } - } catch (ClassNotFoundException e) { - throw new IllegalStateException("Cannot instrospect bean: " + definition, e); } + else if (source instanceof FileSystemResource) { + try { + Type type = ClassUtils.forName(definition.getBeanClassName(), null); + if (type instanceof ParameterizedType) { + Type typeArgumentAtIndex = ((ParameterizedType) type) + .getActualTypeArguments()[index]; + if (typeArgumentAtIndex instanceof ParameterizedType) { + param = ((ParameterizedType) typeArgumentAtIndex) + .getActualTypeArguments()[0]; + } + else { + param = typeArgumentAtIndex; + } + } + else { + param = type; + } + } + catch (ClassNotFoundException e) { + throw new IllegalStateException( + "Cannot instrospect bean: " + definition, e); + } + } + else { + ResolvableType resolvable = (ResolvableType) getField(definition, + "targetType"); + if (resolvable != null) { + param = resolvable.getGeneric(index).getGeneric(0).getType(); + } + else return Object.class; + } + if (param instanceof ParameterizedType) { + ParameterizedType concrete = (ParameterizedType) param; + param = concrete.getRawType(); + } + return ClassUtils.resolveClassName(param.getTypeName(), + registry.getClass().getClassLoader()); } - else { - ResolvableType resolvable = (ResolvableType) getField(definition, - "targetType"); - param = resolvable.getGeneric(index).getGeneric(0).getType(); - } - if (param instanceof ParameterizedType) { - ParameterizedType concrete = (ParameterizedType) param; - param = concrete.getRawType(); - } - return ClassUtils.resolveClassName(param.getTypeName(), - registry.getClass().getClassLoader()); - } - private Object getField(Object target, String name) { - Field field = ReflectionUtils.findField(target.getClass(), name); - ReflectionUtils.makeAccessible(field); - return ReflectionUtils.getField(field, target); - } - - private Class findInputType(String name) { - if (!registry.containsBeanDefinition(name)) { - return Object.class; + private Object getField(Object target, String name) { + Field field = ReflectionUtils.findField(target.getClass(), name); + ReflectionUtils.makeAccessible(field); + return ReflectionUtils.getField(field, target); } - return findType((AbstractBeanDefinition) registry.getBeanDefinition(name), 0); - } - private Class findOutputType(String name) { - if (!registry.containsBeanDefinition(name)) { - return Object.class; + private Class findInputType(String name) { + if (!registry.containsBeanDefinition(name)) { + return Object.class; + } + return findType((AbstractBeanDefinition) registry.getBeanDefinition(name), 0); } - return findType((AbstractBeanDefinition) registry.getBeanDefinition(name), 1); - } } + + private Class findOutputType(String name) { + if (!registry.containsBeanDefinition(name)) { + return Object.class; + } + return findType((AbstractBeanDefinition) registry.getBeanDefinition(name), 1); + } + } } diff --git a/spring-cloud-function-samples/spring-cloud-function-sample-compiler/src/test/java/com/example/SampleApplicationTests.java b/spring-cloud-function-samples/spring-cloud-function-sample-compiler/src/test/java/com/example/SampleApplicationTests.java index 1bfd3d432..3744500c8 100644 --- a/spring-cloud-function-samples/spring-cloud-function-sample-compiler/src/test/java/com/example/SampleApplicationTests.java +++ b/spring-cloud-function-samples/spring-cloud-function-sample-compiler/src/test/java/com/example/SampleApplicationTests.java @@ -41,8 +41,8 @@ public class SampleApplicationTests { @Test public void lowercase() { assertThat(new TestRestTemplate().postForObject( - "http://localhost:" + port + "/test", "it works", - String.class)).isEqualTo("it works!!!"); + "http://localhost:" + port + "/test", "[\"it works\"]", + String.class)).isEqualTo("[\"it works!!!\"]"); } } diff --git a/spring-cloud-function-samples/spring-cloud-function-sample-pojo/src/test/java/com/example/SampleApplicationTests.java b/spring-cloud-function-samples/spring-cloud-function-sample-pojo/src/test/java/com/example/SampleApplicationTests.java index d316e02ef..474e578a9 100644 --- a/spring-cloud-function-samples/spring-cloud-function-sample-pojo/src/test/java/com/example/SampleApplicationTests.java +++ b/spring-cloud-function-samples/spring-cloud-function-sample-pojo/src/test/java/com/example/SampleApplicationTests.java @@ -41,14 +41,14 @@ public class SampleApplicationTests { public void words() { assertThat(new TestRestTemplate() .getForObject("http://localhost:" + port + "/words", String.class)) - .isEqualTo("{\"value\":\"foo\"}{\"value\":\"bar\"}"); + .isEqualTo("[{\"value\":\"foo\"},{\"value\":\"bar\"}]"); } @Test public void uppercase() { assertThat(new TestRestTemplate().postForObject( - "http://localhost:" + port + "/uppercase", "{\"value\":\"foo\"}", - String.class)).isEqualTo("{\"value\":\"FOO\"}"); + "http://localhost:" + port + "/uppercase", "[{\"value\":\"foo\"}]", + String.class)).isEqualTo("[{\"value\":\"FOO\"}]"); } } diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/ReactorAutoConfiguration.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/ReactorAutoConfiguration.java index 87dbd6274..80ff896d3 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/ReactorAutoConfiguration.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/ReactorAutoConfiguration.java @@ -35,8 +35,6 @@ import org.springframework.cloud.function.web.flux.response.FluxReturnValueHandl import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.convert.support.DefaultConversionService; -import org.springframework.http.converter.ObjectToStringHttpMessageConverter; import org.springframework.util.ClassUtils; import org.springframework.web.method.support.AsyncHandlerMethodReturnValueHandler; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -57,11 +55,6 @@ public class ReactorAutoConfiguration { @Autowired private ApplicationContext context; - @Bean - public ObjectToStringHttpMessageConverter objectToStringHttpMessageConverter() { - return new ObjectToStringHttpMessageConverter(new DefaultConversionService()); - } - @Bean public FunctionHandlerMapping functionHandlerMapping(FunctionCatalog catalog, FunctionInspector inspector) {