如何在序列化期间隐藏字段(但不反序列化)

时间:2016-01-12 09:05:45

标签: serialization jackson hide swagger springfox

在我们的项目(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,有没有办法以不同的方式存档?

2 个答案:

答案 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 否则会导致反序列化中删除元素