jackson - 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 代码生成部分中的错误有关?
有没有办法在服务器存根端解决这个问题?
解决方案
推荐阅读
- xml - XSLT 循环遍历具有针对模式的属性的元素
- .net - NoReboot=false 不适用于 CreateImageRequest
- javascript - 单击几次后弹出窗口内容未显示
- node.js - 处理续集迁移和初始化的工作流程?
- python - SGD 最大化距离
- objective-c - 如何在 swift 中创建 @objc 可表示类型?
- java - 变量不会更新(在 If 语句中)
- ios - 来自 NSKeyedUnarchiver 的未归档数据的投射失败,来自 Any? 键入 OIDAuthState
- django - 在 Django 1.10 中重写 URL
- c# - 将大值乘以负值