msgpack / msgpack-java

MessagePack serializer implementation for Java / msgpack.org[Java]
http://msgpack.org/
Apache License 2.0
1.41k stars 321 forks source link

Failure caused by nanosecond precision with Java 17 on Linux #743

Closed sndmn1 closed 1 year ago

sndmn1 commented 1 year ago

https://github.com/msgpack/msgpack-java/blob/4b3895488c1263bf91489748bdceac0069bca85e/msgpack-jackson/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java#L253

When using org.springframework.data.annotation.LastModifiedDate on a Linux machine, a default precision of nanoseconds is used by Java 17. This causes the following error when serializing the data using MessagePack:

java.lang.IllegalArgumentException: MessagePack cannot serialize a BigDecimal that can't be represented as double. 1688078504.174525930
    at org.msgpack.jackson.dataformat.MessagePackGenerator.packBigDecimal(MessagePackGenerator.java:275)
    at org.msgpack.jackson.dataformat.MessagePackGenerator.pack(MessagePackGenerator.java:233)
    at org.msgpack.jackson.dataformat.MessagePackGenerator.packArray(MessagePackGenerator.java:306)
    at org.msgpack.jackson.dataformat.MessagePackGenerator.pack(MessagePackGenerator.java:224)
    at org.msgpack.jackson.dataformat.MessagePackGenerator.packObject(MessagePackGenerator.java:292)
    at org.msgpack.jackson.dataformat.MessagePackGenerator.flush(MessagePackGenerator.java:521)
    at org.msgpack.jackson.dataformat.MessagePackGenerator.close(MessagePackGenerator.java:505)
    at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4573)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3844)

This did not cause any issues on Java 11 as the default precision appears to be in microseconds.

komamitsu commented 1 year ago

MessagePack format can't represent the precision. Please follow this https://github.com/msgpack/msgpack-java/blob/develop/msgpack-jackson/README.md#serialize-and-deserialize-bigdecimal-as-str-type-internally-in-messagepack-format

sndmn1 commented 1 year ago

@komamitsu, thanks for the suggestion. This has resolved our issue.

komamitsu commented 1 year ago

@sndmn1 We added a new API to easily enable to handle BigDecimal value in String as follows

  ObjectMapper objectMapper = new MessagePackMapper().handleBigDecimalAsString();

This feature has been released as 0.9.4.

See https://github.com/msgpack/msgpack-java/tree/develop/msgpack-jackson#serialize-and-deserialize-bigdecimal-as-str-type-internally-in-messagepack-format for details.