swagger-api / swagger-api/swagger-parser

cannot deserialize from Object value (Grallvm native executable)

Open
#2,147 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
867
Forks
560
Avg merge
2d 21h
Merged PRs (30d)
7

Description

Using plain java graalvm native executables cause multiple issues. The parser mostly returns empty OpenAPI objects without any error. Only on one file I can receive an error. I tried to initialise swagger models at run time, but this did not help --initialize-at-run-time=io.swagger.v3.oas.models
It would be really cool to know how to use the swagger parser on plain native java.

[ERROR] Failed to parse OpenAPI file [books.yaml]: Cannot construct instance of `io.swagger.v3.oas.models.media.ArraySchema`: cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized
 at [Source: UNKNOWN; byte offset: #UNKNOWN]
java.lang.IllegalArgumentException: Cannot construct instance of `io.swagger.v3.oas.models.media.ArraySchema`: cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized
 at [Source: UNKNOWN; byte offset: #UNKNOWN]
        at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4618)
        at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4549)
        at io.swagger.v3.parser.converter.SwaggerConverter.convert(SwaggerConverter.java:1188)
        at io.swagger.v3.parser.converter.SwaggerConverter.convert(SwaggerConverter.java:865)
        at io.swagger.v3.parser.converter.SwaggerConverter.convert(SwaggerConverter.java:635)
        at io.swagger.v3.parser.converter.SwaggerConverter.convert(SwaggerConverter.java:531)
        at io.swagger.v3.parser.converter.SwaggerConverter.convert(SwaggerConverter.java:250)
        at io.swagger.v3.parser.converter.SwaggerConverter.readResult(SwaggerConverter.java:104)
        at io.swagger.v3.parser.converter.SwaggerConverter.readLocation(SwaggerConverter.java:85)
        at io.swagger.parser.OpenAPIParser.readLocation(OpenAPIParser.java:16)
        at java.base@22/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:212)
        at java.base@22/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:194)
        at java.base@22/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:194)
        at java.base@22/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:194)
        at java.base@22/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:194)
        at java.base@22/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:212)
        at java.base@22/java.util.Iterator.forEachRemaining(Iterator.java:133)
        at java.base@22/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
        at java.base@22/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:556)
        at java.base@22/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:546)
        at java.base@22/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.base@22/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.base@22/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
        at java.base@22/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:611)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.swagger.v3.oas.models.media.ArraySchema`: cannot deserialize from Object value (no delegate- or property-based Creator): this appears to be a native image, in which case you may need to configure reflection for the class that is to be deserialized
 at [Source: UNKNOWN; byte offset: #UNKNOWN]
        at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1887)
        at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:414)
        at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1370)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1505)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:348)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185)
        at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4613)
swagger: "2.0"
info:
  version: "1.0.0"
  title: "Books API"
  description: "API to manage books, authors, and their relationships."
  termsOfService: "https://api.books.example.com/terms"
  contact:
    name: "API Support"
    url: "https://api.books.example.com/support"
    email: "support@books.example.com"
  license:
    name: "MIT"
    url: "https://opensource.org/licenses/MIT"
host: "api.books.example.com"
basePath: "/v1"
schemes:
  - https
tags:
  - name: "Books"
    description: "Operations related to books"
  - name: "Authors"
    description: "Operations related to authors"
  - name: "Management"
    description: "Administrative operations"
paths:
  /books:
    get:
      tags:
        - "Books"
      summary: "Retrieve all books"
      description: "Returns a list of all books available in the system."
      responses:
        200:
          description: "A list of books"
          schema:
            type: "array"
            items:
              $ref: "#/definitions/Book"
    post:
      tags:
        - "Books"
      summary: "Add a new book"
      description: "Adds a new book to the library."
      parameters:
        - in: "body"
          name: "body"
          required: true
          schema:
            $ref: "#/definitions/Book"
      responses:
        201:
          description: "Book created successfully"
  /books/{id}:
    get:
      tags:
        - "Books"
      summary: "Retrieve a specific book"
      description: "Fetch details of a book by its unique ID."
      parameters:
        - name: "id"
          in: "path"
          required: true
          type: "string"
      responses:
        200:
          description: "Book details retrieved"
          schema:
            $ref: "#/definitions/Book"
        404:
          description: "Book not found"
    put:
      tags:
        - "Books"
      summary: "Update a book"
      description: "Updates information for a specific book."
      parameters:
        - name: "id"
          in: "path"
          required: true
          type: "string"
        - in: "body"
          name: "body"
          required: true
          schema:
            $ref: "#/definitions/Book"
      responses:
        200:
          description: "Book updated successfully"
    delete:
      tags:
        - "Books"
      summary: "Delete a book"
      description: "Deletes a specific book by its ID."
      parameters:
        - name: "id"
          in: "path"
          required: true
          type: "string"
      responses:
        204:
          description: "Book deleted successfully"
  /authors:
    get:
      tags:
        - "Authors"
      summary: "Retrieve all authors"
      description: "Fetch a list of all authors."
      responses:
        200:
          description: "A list of authors"
          schema:
            type: "array"
            items:
              $ref: "#/definitions/Author"
    post:
      tags:
        - "Authors"
      summary: "Add a new author"
      description: "Adds a new author to the system."
      parameters:
        - in: "body"
          name: "body"
          required: true
          schema:
            $ref: "#/definitions/Author"
      responses:
        201:
          description: "Author added successfully"
definitions:
  Book:
    type: "object"
    required:
      - id
      - title
    properties:
      id:
        type: "string"
      title:
        type: "string"
      author:
        type: "string"
      publishedDate:
        type: "string"
        format: "date"
      genre:
        type: "string"
        description: "Genre of the book"
  Author:
    type: "object"
    required:
      - id
      - name
    properties:
      id:
        type: "string"
      name:
        type: "string"
      biography:
        type: "string"
        description: "A brief biography of the author"
      birthDate:
        type: "string"
        format: "date"
        description: "Author's date of birth"
securityDefinitions:
  api_key:
    type: "apiKey"
    name: "X-API-KEY"
    in: "header"
externalDocs:
  description: "Find more info here"
  url: "https://api.books.example.com/docs"

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the native executable parsing books.yaml, then trace the failure from OpenAPIParser.readLocation through SwaggerConverter.convert to ArraySchema deserialization. Compare the native result with the regular Java parser and determine what is needed for the native parser to return populated OpenAPI objects without the reported exception.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.