在我们的项目(springMVC)Rest API项目中,我希望只对请求和响应使用一个模型(以避免必须添加大量代码来从对象复制字段到对象)
我想使用Swagger处理所有文档,但我遇到了一个小问题。例如,假设我有一个模型用户
public class User {
private Long id;
private String username;
private String password;
}
一个简单的控制器
public void createUser(@RequestBody User user)...
public User getUser(Long id) ..
现在我想在反序列化时隐藏属性密码而不是序列化(因此显示输入但是输出) 与Id领域相反。
我尝试过使用@JsonIgnore和@JsonProperty ,但是在swagager-ui上它显示所有内容或隐藏所有内容。我无法胜任它。
有人可以告诉我归档目标的最佳方式是什么?使用swagger时,是否可以使用单个模型进行请求和响应?如果无法使用@JsonIgnore,有没有办法以不同的方式存档?
答案 0 :(得分:2)
Swagger不希望您使用具有相同名称的不同输入/输出模型。您应该只创建一个接口并将其附加到输入,并为输出扩展该接口或添加带有附加字段的实现。例如,请参阅此处获取建模提示:
https://swaggerhub.com/api/swagger-tutorials/modeling-samples/1.0.0
您的确切用例就是其中之一。上述链接中公布的解决方案如下:
definitions:
User:
description: this is a user that would be passed into the system
properties:
username:
type: string
UserResponse:
allOf:
- $ref: '#/definitions/User'
- type: object
required:
- id
properties:
id:
type: string
format: uuid
readOnly: true
其中User
是输入对象,UserResponse
是输出对象,附加id
字段。
答案 1 :(得分:0)
添加 @JsonIgnore 与字段的 getter 和 @JsonProperty 与 setter 或与字段。由于使用不可变代码或最终字段,有时 setter 不起作用。
示例:
public class Student {
private Float name;
private String rollnum;
private String section;
@JsonProperty
private Boolean passOrFailed;
@JsonIgnore
public Boolean getpassOrFailed {
return active;
}
}
记得同时使用 else 否则会导致反序列化中删除元素