Add skip conversion header logic
This commit is contained in:
@@ -32,6 +32,11 @@ public class FunctionProperties {
|
|||||||
*/
|
*/
|
||||||
public final static String PREFIX = "spring.cloud.function";
|
public final static String PREFIX = "spring.cloud.function";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of he header to be used to instruct function catalog to skip type conversion.
|
||||||
|
*/
|
||||||
|
public final static String SKIP_CONVERSION_HEADER = "skip-type-conversion";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Definition of the function to be used. This could be function name (e.g., 'myFunction')
|
* Definition of the function to be used. This could be function name (e.g., 'myFunction')
|
||||||
* or function composition definition (e.g., 'myFunction|yourFunction')
|
* or function composition definition (e.g., 'myFunction|yourFunction')
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import org.springframework.beans.factory.BeanFactory;
|
|||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.cloud.function.context.FunctionCatalog;
|
import org.springframework.cloud.function.context.FunctionCatalog;
|
||||||
|
import org.springframework.cloud.function.context.FunctionProperties;
|
||||||
import org.springframework.cloud.function.context.FunctionRegistration;
|
import org.springframework.cloud.function.context.FunctionRegistration;
|
||||||
import org.springframework.cloud.function.context.FunctionRegistry;
|
import org.springframework.cloud.function.context.FunctionRegistry;
|
||||||
import org.springframework.cloud.function.context.FunctionType;
|
import org.springframework.cloud.function.context.FunctionType;
|
||||||
@@ -156,8 +157,8 @@ public class BeanFactoryAwareFunctionRegistry
|
|||||||
@Override
|
@Override
|
||||||
public FunctionRegistration<?> getRegistration(Object function) {
|
public FunctionRegistration<?> getRegistration(Object function) {
|
||||||
FunctionRegistration<?> registration = this.registrationsByFunction.get(function);
|
FunctionRegistration<?> registration = this.registrationsByFunction.get(function);
|
||||||
// need to do this due to the deployer not wrapping the actual target into FunctionInvocationWrapper
|
// // need to do this due to the deployer not wrapping the actual target into FunctionInvocationWrapper
|
||||||
// hence the lookup would need to be made by the actual target
|
// // hence the lookup would need to be made by the actual target
|
||||||
if (registration == null && function instanceof FunctionInvocationWrapper) {
|
if (registration == null && function instanceof FunctionInvocationWrapper) {
|
||||||
function = ((FunctionInvocationWrapper) function).target;
|
function = ((FunctionInvocationWrapper) function).target;
|
||||||
}
|
}
|
||||||
@@ -165,13 +166,10 @@ public class BeanFactoryAwareFunctionRegistry
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Object locateFunction(String name) {
|
private Object locateFunction(String name) {
|
||||||
Object function = null;
|
Object function = this.registrationsByName.get(name);
|
||||||
if (this.applicationContext.containsBean(name)) {
|
if (function == null && this.applicationContext.containsBean(name)) {
|
||||||
function = this.applicationContext.getBean(name);
|
function = this.applicationContext.getBean(name);
|
||||||
}
|
}
|
||||||
if (function == null) {
|
|
||||||
function = this.registrationsByName.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (function != null && this.notFunction(function.getClass())
|
if (function != null && this.notFunction(function.getClass())
|
||||||
&& this.applicationContext.containsBean(name + FunctionRegistration.REGISTRATION_NAME_SUFFIX)) { // e.g., Kotlin lambdas
|
&& this.applicationContext.containsBean(name + FunctionRegistration.REGISTRATION_NAME_SUFFIX)) { // e.g., Kotlin lambdas
|
||||||
@@ -186,7 +184,6 @@ public class BeanFactoryAwareFunctionRegistry
|
|||||||
&& !Consumer.class.isAssignableFrom(functionClass);
|
&& !Consumer.class.isAssignableFrom(functionClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Type discoverFunctionType(Object function, String... names) {
|
private Type discoverFunctionType(Object function, String... names) {
|
||||||
boolean beanDefinitionExists = false;
|
boolean beanDefinitionExists = false;
|
||||||
for (int i = 0; i < names.length && !beanDefinitionExists; i++) {
|
for (int i = 0; i < names.length && !beanDefinitionExists; i++) {
|
||||||
@@ -674,6 +671,10 @@ public class BeanFactoryAwareFunctionRegistry
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean messageNeedsConversion(Type rawType, Message<?> message) {
|
private boolean messageNeedsConversion(Type rawType, Message<?> message) {
|
||||||
|
String skipConversion = message.getHeaders().get(FunctionProperties.SKIP_CONVERSION_HEADER, String.class);
|
||||||
|
if (StringUtils.hasText(skipConversion) && Boolean.valueOf(skipConversion)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return rawType instanceof Class<?>
|
return rawType instanceof Class<?>
|
||||||
&& !(message.getPayload() instanceof Optional)
|
&& !(message.getPayload() instanceof Optional)
|
||||||
&& !(message.getPayload().getClass().isAssignableFrom(((Class<?>) rawType)));
|
&& !(message.getPayload().getClass().isAssignableFrom(((Class<?>) rawType)));
|
||||||
|
|||||||
Reference in New Issue
Block a user