Hibernate DropWizard@ValidationMethod添加json属性

Hibernate DropWizard@ValidationMethod添加json属性,hibernate,jackson,dropwizard,Hibernate,Jackson,Dropwizard,我有一个DropWizard表示,它有一个ValidationMethod。当我尝试为它编写单元测试时,当我使用jackson ObjectMapper时,是在json字符串中插入一个额外的属性,它是有效的{name_of_other_property}:boolean 这打破了使用fixture并将ObjectMapping输出与一些固定json文件进行比较的系统。有没有其他人遇到过这个问题,并想出了最好的解决办法 编辑以添加示例 public class Cat { @NotEmpty

我有一个DropWizard表示,它有一个ValidationMethod。当我尝试为它编写单元测试时,当我使用jackson ObjectMapper时,是在json字符串中插入一个额外的属性,它是有效的{name_of_other_property}:boolean

这打破了使用fixture并将ObjectMapping输出与一些固定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夹具测试文档:

但是我正在从对象映射器返回Json。writeValueAsString(object)为我提供了一个额外属性Json:

{
  name:"Felix"
  validCatName:true
}
这意味着单元测试失败了。但是,我没有注意到在使用表示作为我的资源的参数时存在这个额外的字段

谢谢, 伊恩


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

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

对我来说,json属性是如何编写的(大写与否)并不重要。因此,即使属性“catName”也可以有以下验证方法名称:

  • isCatName或
  • isCatname或
  • iscatName或
  • iscatname或
使用格式:“is”+propertyName非常重要。但我不确定这是否总是真的。也许骆驼壳和蛇壳之间有区别

固定代码示例:

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

}

有两种方法可以解决这个问题

  • 显式指定映射器以忽略此类属性

    @ValidationMethod(message=“不是猫名!”)
    @杰索尼奥雷
    公共布尔值isValidCatName(){
    返回(!“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));
    
两者都会产生结果


干杯

嗨,莱恩,很难知道你的问题是什么(至少对我来说是这样)。也许你可以在你的问题中添加一些代码,并指出哪些地方没有达到预期效果?嗨,我已经用更多的代码更新了这个例子,使它更清晰。