arangodb/jackson-dataformat-velocypack

Deserialisation of Int to BigDecimal fails

jebbench opened this issue · 3 comments

Attempting to deserialise an int as a BigDecimal fails with the following exception:

Caused by: com.arangodb.velocypack.exception.VPackValueTypeException: Expecting type STRING or DOUBLE
	at com.arangodb.velocypack.VPackSlice.getAsBigDecimal(VPackSlice.java:293) ~[velocypack-2.3.1.jar:?]
	at com.arangodb.jackson.dataformat.velocypack.internal.VPackParser.getDecimalValue(VPackParser.java:289) ~[jackson-dataformat-velocypack-0.1.5.jar:?]
	at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$BigDecimalDeserializer.deserialize(NumberDeserializers.java:948) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.std.NumberDeserializers$BigDecimalDeserializer.deserialize(NumberDeserializers.java:927) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:542) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:535) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:419) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1310) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:331) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4482) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3504) ~[jackson-databind-2.11.0.jar:2.11.0]
	at com.arangodb.VelocyJack.deserialize(VelocyJack.java:112) ~[jackson-dataformat-velocypack-0.1.5.jar:?]
	... 18 more

This is caused by the getAsBigDecimal method in VPackSlice.java not parsing ints.

public BigDecimal getAsBigDecimal() {
		if (isString()) {
			return new BigDecimal(getAsString());
		} else if (isDouble()) {
			return BigDecimal.valueOf(getAsDouble());
		} else {
			throw new VPackValueTypeException(ValueType.STRING, ValueType.DOUBLE);
		}
	}

I've the beginnings of a PR here: https://github.com/jebbench/java-velocypack/tree/ints-as-big-decimals

let me know if you think this is worth continuing with - in the meantime I'll change my types to doubles.

@jebbench your fork looks good to me, please open a PR against https://github.com/arangodb/java-velocypack

@jebbench any update about this?