Timestamp ISO8601 format issue

Issue #331 resolved
Former user created an issue

In an OpenAPI specification an attribute timestamp with format "date-time" and as an example value "example": "1937-01-01T12: 00: 27.87 + 00: 20" is entered. I deliberately chose the value for the example from the specification https://datatracker.ietf.org/doc/html/rfc3339 . When creating the object "OpenApiInteractionValidator" using the specification, I get an exception.

Stacktrace:

java.lang.IllegalArgumentException: Java 8 date/time type java.time.OffsetDateTime not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: java.util.LinkedHashMap["Pet"]
->io.swagger.v3.oas.models.media.ObjectSchema["properties"]
->java.util.LinkedHashMap["timestamp"]
->io.swagger.v3.oas.models.media.DateTimeSchema["example"]) 
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4314) 
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4245) 
at com.atlassian.oai.validator.schema.SchemaValidator.lambda$new$0(SchemaValidator.java:92) 
at java.base/java.util.Optional.map(Optional.java:265) 
at com.atlassian.oai.validator.schema.SchemaValidator.<init>(SchemaValidator.java:92) 
at com.atlassian.oai.validator.OpenApiInteractionValidator.<init>(OpenApiInteractionValidator.java:149) 
at com.atlassian.oai.validator.OpenApiInteractionValidator.<init>(OpenApiInteractionValidator.java:46) 
at com.atlassian.oai.validator.OpenApiInteractionValidator$Builder.build(OpenApiInteractionValidator.java:543) 
at org.example.App.main(App.java:88) 
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.OffsetDateTime not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: java.util.LinkedHashMap["Pet"]->io.swagger.v3.oas.models.media.ObjectSchema["properties"]->java.util.LinkedHashMap["timestamp"]->io.swagger.v3.oas.models.media.DateTimeSchema["example"]) 
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) 
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) 
at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:869) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:760) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35) 
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) 
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeOptionalFields(MapSerializer.java:869) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:760) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720) 
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35) 
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) 
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) 
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4292) ... 8 more

As an attachment I have a modified Petstore specification added to which the failure occurs.

I am currently using Release 2.15.1 and have also tested with the newer versions with the same result.

Best regards Peter

Comments (8)

  1. Pete Cornish

    I was able to fix this by adding the following dependency:

    com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.12.3
    

    and invoking this before using the validator:

    // adds support for JSR-310 data types
    io.swagger.util.Json.mapper().registerModule(new JavaTimeModule());
    

    This works because swagger-request-validator-core uses swagger-core.

  2. Jeroen van Dijk

    Thanks @Pete Cornish could you elaborate a bit more on the solution please? I tried invoking it with you code snippit but I get the error:

    Invalid method declaration; return type required

    I suspect I’m adding the code snippit in the wrong place?

  3. Kevin Van keer

    The ‘issue’ seems to be in SchemaValidator.java.

    It still uses the io.swagger.util.Json class instead of the io.swagger.v3.core.util.Json class. (The v3 version already adds the JavaTimeModule)

    I also had to manually register the JavaTimeModule to fix my tests.

    Although I don’t know the impact of using the newer Json class, I would suggest that this is the desired situation.

  4. Log in to comment