【问题标题】:how to hide field during serialization (but not deserialization)如何在序列化期间隐藏字段(但不是反序列化)
【发布时间】:2016-04-16 19:32:44
【问题描述】:

在我们的项目(springMVC)Rest API 项目中,我希望只对请求和响应使用 ONE 模型(以避免添加大量代码来将字段从对象复制到对象)

我想使用 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,但在 swagger-ui 上它要么显示所有内容,要么隐藏所有内容。我无法让它工作。

有人可以告诉我存档目标的最佳方式是什么吗?在使用 swagger 时是否可以使用单个模型进行请求和响应?如果无法使用@JsonIgnore,有没有办法以不同的方式存档?

【问题讨论】:

    标签: serialization jackson hide swagger springfox


    【解决方案1】:

    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 字段。

    【讨论】:

    • 我确实尝试过接口路线,但我没有设法让 springMVC 的“@RequestBody”与接口一起工作。我的意思是它确实适用于招摇,但我不能调用端点,因为它不知道要使用哪个实现。 (我用 getUsername 和 setUsername 创建了一个 UserRequest 接口,我让 User 实现了它,我把 UserRequest 放在 @RequestBody 和 User 中作为响应)
    • 我遇到的第二个接口问题是“子对象”。考虑我在 User 类中有一个“地址”对象。我没有反序列化字段地址,例如在 Address 对象中
    • 您可以尝试将UserUserResponse 的java 类作为子类吗?我希望 springfox 能够很好地完成这项工作。您可能需要在该 repo 上打开一个问题
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2015-04-18
      • 2013-08-17
      • 2012-09-12
      • 2011-10-18
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多