首页 > 解决方案 > Swagger OpenApi 3.0 Jaxrs:使用 oneOf 导致 InvalidDefinitionException:无法构造实例

问题描述

我有以下使用 oneOf 关键字的 swagger.yaml。

openapi: 3.0.0
info:
  version: 0.0.1
  title: Polymorphism example
  description: ''

paths:
 /animal:
    post:
      summary: Create a new animal   
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Animal'
              
      responses:
        '201':
          description: Created        

components:
  schemas:
  
    Animal:
      type: object
      properties:
        name: 
          type: string
        props:  
          oneOf:
            - $ref: '#/components/schemas/Fish'
            - $ref: '#/components/schemas/Dog'
      
      
    Fish:
      type: object
      properties:
        depth:
          type: integer
          
    
    Dog:
      type: object
      properties:
        country:
          type: string      

如果使用最新的 Swagger 代码生成工具 ( 3.0.22) 为 JAX-RS Jersey 创建服务器存根。

我正在尝试发布以下示例对象:

{
   "name":"Foo",
   "props":{
      "country":"Bar"
   }
}

但这会导致以下异常:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.swagger.model.OneOfAnimalProps` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 30] (through reference chain: io.swagger.model.Animal["props"])
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl (WebComponent.java:432)
    at org.glassfish.jersey.servlet.WebComponent.service (WebComponent.java:370)
    at org.glassfish.jersey.servlet.ServletContainer.service (ServletContainer.java:389)
    at org.glassfish.jersey.servlet.ServletContainer.service (ServletContainer.java:342)
    at org.glassfish.jersey.servlet.ServletContainer.service (ServletContainer.java:229)
    at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:808)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1669)
    at io.swagger.api.ApiOriginFilter.doFilter (ApiOriginFilter.java:15)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter (ServletHandler.java:1652)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:585)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:577)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:223)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1127)
    at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:515)
    at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1061)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:215)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle (HandlerCollection.java:110)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle (Server.java:497)
    at org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java:310)
    at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run (AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run (QueuedThreadPool.java:555)
    at java.lang.Thread.run (Thread.java:748)

此错误是否与 JAX-RS 代码生成部分中的错误有关?

有没有办法在服务器存根端解决这个问题?

标签: jacksonswaggerjax-rsswagger-codegen

解决方案


推荐阅读