【问题标题】:DropWizard @ValidationMethod adding a json propertyDropWizard @ValidationMethod 添加一个 json 属性
【发布时间】:2014-10-24 16:00:10
【问题描述】:

我有一个具有 ValidationMethod 的 DropWizard 表示。当我尝试为它编写单元测试时,虽然当我使用jackson ObjectMapper 时正在向 json 字符串插入一个附加属性,该属性是有效的{name_of_other_property}:boolean。

这打破了拥有固定装置并将 ObjectMapped 输出与一些固定的 json 文件进行比较的系统。有没有其他人遇到过这个问题并找到了解决它的最佳方法?

编辑以添加示例

public class Cat {

  @NotEmpty
  private String name;

  @JsonProperty
  public String getName() {
      return name;
  }   

  @JsonProperty
  public void setName(String name) {
      this.name=name;
  }

  @ValidationMethod(message = "Not a cat name!")
  public boolean isValidCatName() {
      return (!"Fido".equals(this.name));
  }

}

我正在关注 DropWizard 夹具测试文档: https://dropwizard.github.io/dropwizard/manual/testing.html

但是我从对象映射器中取回 Json,mapper.writeValueAsString(object) 给了我带有额外属性的 json:

{
  name:"Felix"
  validCatName:true
}

这意味着单元测试失败。但是,在将表示用作我的资源的参数时,我没有注意到这个额外的字段存在。

谢谢, 伊恩

编辑:解决方案是将@JsonIgnore 注解添加到验证方法中。

【问题讨论】:

  • 你好,你的问题是很难理解的(至少对我来说是这样)。也许您可以在您的问题中添加一些代码,并指出究竟是什么没有按预期工作?
  • 您好,我已经用更多代码更新了示例以使其更清晰。

标签: hibernate jackson dropwizard


【解决方案1】:

我遇到了一些类似的问题。我不知道我是否正确,但对我来说,验证方法似乎存在命名问题。我让它工作的唯一方法是重命名验证方法。在您的情况下,“isName”而不是“isValidVatName”。如果这解决了您的问题,也许您可​​以尝试并给出答案。只需这样命名您的验证方法:“is”+ {您的 json 属性的名称;在你的情况下'name'}。

对我来说,如何编写 json 属性(是否大写)并不重要。所以即使是属性 'catName' 也可以有这个验证方法名称:

  • isCatName 或
  • isCatname 或
  • iscatName 或
  • iscatname 或 ...

使用格式很重要:“is” + propertyName。但我不确定这是否总是正确的。 camelCase 或 snakecase 之间可能存在差异(= 未测试)

固定代码示例:

public class Cat {

  @NotEmpty
  private String name;

  @JsonProperty
  public String getName() {
      return name;
  }   

  @JsonProperty
  public void setName(String name) {
      this.name=name;
  }

  @ValidationMethod(message = "Not a cat name!")
  public boolean isName() {
      return (!"Fido".equals(this.name));
  }

}

【讨论】:

    【解决方案2】:

    有两种方法可以解决。

    • 明确指定映射器以忽略此类属性

      @ValidationMethod(message = "Not a cat name!") @JsonIgnore public boolean isValidCatName() { return (!"Fido".equals(this.name)); }

    这将返回所需的结果。

    • Mapper 有一些默认属性可以帮助自动检测,您可以禁用这些属性

      ObjectMapper mapper = new ObjectMapper();
      mapper.setVisibility(mapper.getSerializationConfig()
          .getDefaultVisibilityChecker()
          .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
          .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
          .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
          .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)
          .withFieldVisibility(JsonAutoDetect.Visibility.NONE));
      

    两者都会产生结果。

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2022-11-03
      • 2021-05-24
      相关资源
      最近更新 更多