当前位置: 首页 > 知识库问答 >
问题:

如何为Swagger API响应指定泛型类型类

孟泽宇
2023-03-14

我有大约40个API,它们具有类似的基本响应结构,如下所示:

{
    "lastAccessed": "2015-30-08:14:21:45T",
    "createdOn": "2015-30-07:09:04:10T",
    "lastModified": "2015-30-08:14:21:45T",
    "isReadOnly": "false",
    "usersAllowed" : ["Tim", "Matt", "Christine"];
    "noOfEntries": 1,
    "object": [
        "ObjectA": {
             //here object A has its own model
         }
    ]
}

因此,我有一个基本响应类,采用T类型的泛型,如下所示:

public class Response<T> {
    @ApiModelProperty(value="Last time accessed")
    private String lastAccessed;
    @ApiModelProperty(value="Time when Created ")
    private String createdOn;
    private String lastModified;
    @ApiModelProperty(value="Created on")
    private boolean isReadOnly;
    @ApiModelProperty(value="Users that has access to the object.")
    private List<String> usersAllowed;
    private int noOfEntries;
    private T object;

    //getters and setters
}

因此,对于API A,它返回类型为的对象及其自己的字段,我将返回响应作为控制器中的API响应:

  public class A {
    @ApiModelProperty(value="Name")
    private String name;
    @ApiModelProperty(value="OID")
    private String id;    
    //getters and setters
}    

在控制器中:响应数据=新响应();ResponseEntity response=新的ResponseEntity

在swagger中有没有一种方法可以递归地指定响应对象的模型?例如,我可以使用注释@ApiOperation(response=response.class),但它不会使用A的模型。

共有3个答案

呼延永新
2023-03-14

这个问题是在2015年提出的,但我在2020年也在寻找同样的问题。:)所以,我觉得有必要补充一下我在这里发现的东西。

我正在使用springdoc-openapi-用户界面(1.5.0),这取决于Swagger JAR,我明白。由于公共响应类采用通用的T,因此实际的API方法必须定义预期的类型。例如,响应

如果这也是您的场景,那么不定义@ApiResponse的schema属性-

史劲
2023-03-14

我知道这是一篇旧文章,但对于任何寻找答案的人来说:

这可以用于列表集合、和映射响应对象,但任何其他具有泛型类型的类都将被忽略。如果您正在使用这三个选项中的任何一个,那么可以在responseContainer字段中指定它们,并在response字段中指定推断的类型。

@ApiResponse(code = 200, responseContainer="List", respone=java.lang.String.class)
于捷
2023-03-14

我正在使用swagger 2和Follow解决了这个问题。

@ApiResponse@ApiOperation中删除“response”属性。然后,swagger将根据方法存根为您自动生成200 OK的响应类(无论响应类中是否包含泛型)。

@ApiOperation(value = "what your operation does")

@ApiResponses(value = { @ApiResponse(code = 200, message = "Success message") })

更新:你可以做这个简单的工作。只需说你想输出响应

>

  • 在控制器类中,指定一个空的私有类,如下所示

    private MyResponseClass扩展了响应

    对于招摇过市的规格,指定如下:,

    @ApiResponse(code=200,respone=MyResponseClass.class)

    请记住,目前,swagger不支持泛型。以上两个只是变通方法。

  •  类似资料:
    • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta

    • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

    • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

    • 我正在尝试创建一个对通用数字类型的特征抽象。指定我希望特征需要(即

    • “绑定不匹配:Team类型不是league类型 的有界参数 >的有效替代品。”

    • 问题内容: 我正在创建一个通用类,并且需要使用一种方法来了解当前使用的通用类型的Class。原因是我调用的方法之一期望将此作为参数。 例: 显然,上面的示例不起作用,并导致以下错误:类型参数T的非法类文字。 我的问题是:有人知道这方面有很好的选择或解决方法吗? 问题答案: 仍然存在相同的问题:常规信息在运行时被删除,无法恢复。一种解决方法是在静态方法的参数中传递T类: 很难看,但是可以用。