DropWizard @ValidationMethod添加json属性

时间:2014-10-24 16:00:11

标签: hibernate jackson dropwizard

我有一个DropWizard表示,它有一个ValidationMethod。当我尝试为它编写单元测试时,虽然当我使用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注释添加到验证方法中。

2 个答案:

答案 0 :(得分: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));
  }

}

答案 1 :(得分:1)

有两种方法可以解决它。

  • 明确指定mapper为忽略此类属性

    @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));
    

两者都会产生结果。

干杯!