传递带有@JsonIgnore 标记的属性时抛出错误

Posted

技术标签:

【中文标题】传递带有@JsonIgnore 标记的属性时抛出错误【英文标题】:Throw error when properties marked with @JsonIgnore are passed 【发布时间】:2020-10-18 17:41:57 【问题描述】:

我需要使用@JsonIgnore 将我的 REST bean 中的某些属性标记为已忽略。 (我正在使用 Spring Boot)。这有助于在我的 Swagger REST 文档中避免这些属性。

我还想确保如果客户端传递了这些属性,则会发回一个错误。我尝试设置spring.jackson.deserialization.fail-on-unknown-properties=true,但这仅适用于真正未知的属性。标有@JsonIgnore 的属性会通过此检查。

有什么办法可以做到吗?

【问题讨论】:

【参考方案1】:

我想我找到了解决办法 -

如果我将@JsonProperty(access = Access.READ_ONLY) 添加到标记为@JsonIgnore 的字段中,我会收到验证错误。 (我还用@Null 注释标记了该属性。这是完整的解决方案:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Employee 
  @Null(message = "Id must not be passed in request")
  private String id;
  
  private String name;

  //getters and setters


@JsonInclude(JsonInclude.Include.NON_NULL)
public class EmployeeRequest extends Employee 
  @Override
  @JsonIgnore
  @JsonProperty(access = Access.READ_ONLY)
  public void setId(String id) 
    super.setId(id);
  

PS:通过添加@JsonProperty(access = Access.READ_ONLY),该属性开始出现在 Swagger 模型中,我不得不添加 @ApiModelProperty(hidden = true) 以再次隐藏它。 create 方法将EmployeeRequest 作为输入(反序列化),get 方法返回Employee 作为响应(序列化)。如果我在创建请求中通过 id,使用上述解决方案,它会给我一个 ConstraintViolation。

PS PS:无赖。这些解决方案都没有端到端的工作。我最终创建了单独的请求和响应 bean - 它们之间没有层次关系。

【讨论】:

没有什么能令人满意。我最终创建了不同的对象,没有请求和响应的层次结构。

以上是关于传递带有@JsonIgnore 标记的属性时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

@JsonIgnore注解

@JsonIgnore注解和@JSONField(serialize = false)

@JsonIgnore注解和@JSONField(serialize = false)

注解JsonIgnore使用方法

注解JsonIgnore使用方法

JSON注解注解@JsonIgnoreProperties和@JsonIgnore的另一个使用情况