- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的问题与 posted here 相关.
我不得不重新表述我的问题,因为我觉得之前的问题太冗长了。再次尝试一下!
我有一个 REST API,它返回 Assets 列表,其编码如下:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllAssets() {
List<Asset> assets = new ArrayList<Asset>();
for(int i=1; i<11; i++) {
assets.add(new Asset(i));
}
return RestResponse.create(Status.OK, "10 assets Fetched successfully!", assets);
}
它生成的响应是这样的:
{
"message":"10 assets Fetched successfully!",
"content": [{
"id":"1",
"type":"LPTP",
"owner":"Ram",
"serialNo":"WDKLL3234K3",
"purchasedOn":"01 Jan 2017"
},
{
"id":"2",
"type":"LPTP",
"owner":"Ram",
"serialNo":"WDKLL3234K3",
"purchasedOn":"01 Jan 2017"
},
...
]
}
我的应用程序中有超过 60 个服务,它们遵循相同的响应模板:
{
"message":"Message the service wants to send to the client",
"content": {
....
Entity returned by the service
....
}
}
以下是代表我们的响应模板的 RestResponse POJO:
public class RestResponse {
private String message;
private Object content;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
private RestResponse(String message, Object content) {
this.message = message;
this.content = content;
}
public static Response create(Response.Status status, String message, Object content) {
return Response.status(status).entity(new RestResponse(message, content)).build();
}
}
现在我们正在使用 Swagger 记录所有 API,但遇到了问题。
由于我们要返回 RestResponse
对于我们所有的 API 的类,我为我的操作编写了以下注释:
@ApiOperation(value="Fetches all available assets", response=RestResponse.class, responseContainer="List")
Swagger 的作用是在 RestResponse 类的定义架构中,如下所示:
"definitions": {
"RestResponse": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"content": {
"type": "object"
}
}
}
}
在这里,我没有获得有关 content
内对象属性的任何信息或模式。属性(property)。
我理解这是因为 Swagger 不适用于通用对象。
所以如果我改变我的@ApiOperation
下面的注释:
@ApiOperation(value="Fetches all available assets", response=Asset.class, responseContainer="List")
在上面的例子中,Swagger 描述了 Asset
的属性实体,但显然,message
(我的回复模板的)属性丢失。
我的问题是我想两者兼得。 content
我的响应模板的属性可以是任何实体。
那么,我可以设置 response=Asset.class
并指示 Swagger 附上 Asset
到RestResponse
content
属性(property)先于文件吗?或者我可以通过其他方式实现这一目标吗?
希望这次我是准确的!
谢谢,斯里拉姆·斯里达兰。
编辑 - 在我尝试了 Marc Nuri 的建议后我创建了一个类似的RestServiceResponse.class
使用通用对象,并设置 responseReference
我的 @ApiOperation
的属性至RestServiceResponse<Asset>
。下面是我得到的 JSON。
{
"swagger": "2.0",
"info": {
"version": "1.0.0",
"title": ""
},
"host": "localhost:7070",
"basePath": "/assets/rest",
"tags": [
{
"name": "Assets"
}
],
"schemes": [
"http"
],
"paths": {
"/assets/{id}": {
"get": {
"tags": [
"Assets"
],
"summary": "Fetches information about a single asset",
"description": "",
"operationId": "fetchAssetDetail",
"produces": [
"application/json"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"type": "integer",
"format": "int32"
}
],
"responses": {
"200": {
"description": "successful operation",
"schema": {
"$ref": "#/definitions/RestServiceResponse<Asset>"
}
}
}
}
}
}
}
如您所见,Definitions
部分完全丢失。我错过了什么吗?
我有我的project in GitHub ,以防您需要查看整个代码。请帮助我。
最佳答案
我们在微服务响应中使用类似的结构。
唯一的区别是我们的响应容器(即 RestResponse
)没有原始类型,并使用消息正文/内容的 Type 参数。
请尝试将您的 RestResponse 更改为:
public class RestResponse<T> {
private String message;
private T content;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
private RestResponse(String message, T content) {
this.message = message;
this.content = content;
}
public static <T> Response create(Response.Status status, String message, Object content) {
return Response.status(status).entity(new RestResponse(message, content)).build();
}
}
然后像这样注释您的端点:
@ApiOperation(
value="Fetches all available assets",
responseReference = "RestResponse<List<Asset>>")
这对于最新版本的 swagger 来说工作正常。
关于java - 如何将响应实体封装到 Swagger 中的主模板响应中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46708347/
我需要使用封装打印3个变量,并且无法修改主类。 主类声明变量[汽缸、制造商、所有者],并希望使用如下参数创建和打印一个对象: System.out.println (new Vehicle (cyli
我正在研究“Beginning Ruby”这本书,在我进行封装之前一切都进行得很顺利。我明白这段代码在做什么,我只是不知道为什么要用这些方法设置它。 对于那些感兴趣的人 this is the lin
所以我一直在研究面向对象的完整开发 JavaScript 实践,并对以下示例感到好奇。 据我了解,(这对我来说很有意义)以下“ secret ”字段是“私有(private)”的: var MyObj
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代
封装 被定义为 把一个或多个项目封闭在一个物理的或者逻辑的包中 。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可
今天我读了一本书,作者写道,在一个设计良好的类中,访问属性的唯一方法是通过其中一个类方法。这是一个被广泛接受的想法吗?为什么封装属性如此重要?不做会有什么后果?我早些时候在某处读到这可以提高安全性或类
今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些: 没有继承就可以封装吗? 没有继承就可以抽
我正在制作一个简单的网站,并编写了gradle构建脚本,该脚本将执行诸如lint并最小化css / html / js之类的事情。 在这一阶段,我刚刚完成了正在运行的CSS,但是只是初始的非结构化格式
下面的幻灯片是指 C++ 语言,它说 "encapsulation is about ensuring the user uses our ADT in a safe way" 但是,如果他可以访问我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
面向对象的概念:封装、数据抽象和数据隐藏是3个不同的概念,但彼此之间非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方可用的信息与互联网上另一个地方的信息相矛盾。有人可以指导我阅读
我被封装困住了。在我看来,好像我已经按照规则做了一切,但仍然不起作用。虽然我知道我错过了一些东西。我正在使用 Eclipse。 我想要通过创建一副标准 52 张卡片来进行一些练习,并尝试我学到的新东西
在java中,要获取映射中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是 keys ?名称 Set 是否会泄露有关实现的详细信息? 据我了解,Java 是静态类型语言,名称中包
我正在尝试找出如何防止应用程序中的页面变量被全局定义。我想出了一些方法,但我想知道是否有人们使用的通用标准方法。 我使用这种方法得到了我的插件设计模式:http://www.virgentech.co
我有一个 tcp 连接,我想在服务器类的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。 private async void HandleConnecti
这是我类(class)的一个小样本: #include #include using std::string; using std::vector; struct Book { string
我想要类似下面的代码: class Foo{ public: void update() { for( auto dataModifier : _dataModifierLis
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我知道封装意味着一个对象不应该直接访问不同对象的成员……但我猜它与公共(public)领域有关?我假设公共(public)方法不会破坏封装..?我只是在这里不清楚,很高兴得到任何解释。 最佳答案
我就废话不多说了,大家还是直接看代码吧~ ? 1
我是一名优秀的程序员,十分优秀!