Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.security.Principal;

Expand Down Expand Up @@ -126,81 +125,6 @@ private static Logger getLogger() {
return LoggerFactory.getLogger(EndpointInvoker.class);
}

private boolean needsFloatToIntCoercion(JsonNode node, Type targetType) {
if (node == null) {
return false;
}

// Direct number node
if (node.isNumber() && isIntegralType(targetType)
&& !node.canConvertToExactIntegral()) {
return true;
}

// Array node containing floats to be converted to integral types
if (node.isArray() && isIntegralType(targetType)) {
for (JsonNode element : node) {
if (element.isNumber()
&& !element.canConvertToExactIntegral()) {
return true;
}
}
}

// Object node (for Maps and complex objects)
if (node.isObject() && targetType instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) targetType).getRawType();
if (rawType instanceof Class<?>
&& Map.class.isAssignableFrom((Class<?>) rawType)) {
Type[] args = ((ParameterizedType) targetType)
.getActualTypeArguments();
if (args.length > 1 && isIntegralType(args[1])) {
// Check if any map values need conversion
for (JsonNode value : node) {
if (value.isNumber()
&& !value.canConvertToExactIntegral()) {
return true;
}
}
}
}
}

return false;
}

private boolean isIntegralType(Type type) {
if (type instanceof Class<?>) {
Class<?> cls = (Class<?>) type;
if (cls.isArray()) {
// Handle array types
return isIntegralType(cls.getComponentType());
}
return cls == int.class || cls == Integer.class || cls == long.class
|| cls == Long.class || cls == short.class
|| cls == Short.class || cls == byte.class
|| cls == Byte.class || cls == java.math.BigInteger.class;
} else if (type instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) type).getRawType();
if (rawType instanceof Class<?>) {
Class<?> cls = (Class<?>) rawType;
// Check for collections of integral types
if (Collection.class.isAssignableFrom(cls)
|| Map.class.isAssignableFrom(cls)) {
Type[] args = ((ParameterizedType) type)
.getActualTypeArguments();
if (args.length > 0) {
// For Map, check the value type (args[1])
int checkIndex = Map.class.isAssignableFrom(cls)
&& args.length > 1 ? 1 : 0;
return isIntegralType(args[checkIndex]);
}
}
}
}
return false;
}

/**
* Gets the return type of the given method.
*
Expand Down Expand Up @@ -418,26 +342,10 @@ private Object[] getVaadinEndpointParameters(
Type parameterType = javaParameters[i];
Type incomingType = parameterType;
try {
JsonNode parameterNode = requestParameters
.get(parameterNames[i]);
Object parameter;

// Jackson 3 limitation: TreeTraversingParser doesn't respect
// ACCEPT_FLOAT_AS_INT
// when deserializing from JsonNode. Convert to string for
// numeric coercion.
if (needsFloatToIntCoercion(parameterNode, parameterType)) {
// Convert JsonNode to string to allow float-to-int coercion
parameter = endpointObjectMapper
.readerFor(endpointObjectMapper.getTypeFactory()
.constructType(incomingType))
.readValue(parameterNode.toString());
} else {
parameter = endpointObjectMapper
.readerFor(endpointObjectMapper.getTypeFactory()
.constructType(incomingType))
.readValue(parameterNode);
}
Object parameter = endpointObjectMapper
.readerFor(endpointObjectMapper.getTypeFactory()
.constructType(incomingType))
.readValue(requestParameters.get(parameterNames[i]));
endpointParameters[i] = parameter;

if (parameter != null) {
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
<swagger.parser.v3.version>2.1.15</swagger.parser.v3.version>
<jackson2.version>2.20.0</jackson2.version>
<jackson-annotations.version>2.20</jackson-annotations.version>
<jackson.version>3.0.0-rc9</jackson.version>
<jackson.version>3.0.0</jackson.version>
<junit.version>5.10.1</junit.version>
<mockito.version>4.5.0</mockito.version>
<flow.version>25.0-SNAPSHOT</flow.version>
Expand Down
Loading