通过将@JsonProperty 值传递给对象映射器来识别属性

Rag*_*oor 1 java spring json hibernate jackson

我正在使用弹簧和休眠。我有一个包含很多字符串成员变量的类(DTO)。我正在尝试实现对此类的搜索。用户应该能够按每个字段进行搜索。我正在使用 jackson json 映射器来序列化和反序列化对象。无论如何可以通过使用 JsonProperty 值来识别 fieldName 吗?

举个例子:我的 DTO

public class SampleDTO{
  private String field1;
  private String field2;
  private String field3;
  private String field4;
  @JsonProperty("FIELD_1")
  public String getField1(){
    return field1;
  }
  @JsonProperty("FIELD_2")
  public String getField2(){
    return field2;
  }
  @JsonProperty("FIELD_3")
  public String getField3(){
    return field3;
  }
  @JsonProperty("FIELD_4")
  public String getField4(){
    return field4;
  }
}
Run Code Online (Sandbox Code Playgroud)

让它成为我的搜索功能

public Set<T> search(String fieldName, String searchKeyword) {
   String originalFieldName = someMagicFunction(fieldName);
   //if fieldName= "FIELD_1", someMagicFunction should return "field1"
   Criteria criteria = session.createCriteria(T.class);
   criteria.add(Restrictions.eq(originalFieldName, searchKeyword));
   return new HashSet<T>(criteria.list());
} 
Run Code Online (Sandbox Code Playgroud)

任何实现都很好。我正在寻找一种处理此类案件的好方法。感觉就像手动查找字段涉及“打字太多”。

Raf*_* G. 5

你基本上想使用反射。当涉及到字段查找时,这里有两种可能性:

  • @JsonProperty 注解的值
  • 字段真实名称

在第一种情况下,您可能希望使用一些额外的库来减轻使用反射 + 注释时的痛苦,但是粗略的代码看起来更不像这样:

    SampleDTO dto = new SampleDTO();
    // setup some values here

    Field[] fields = r.getClass().getFields();

    for(Field f : fields) {
        JsonProperty jsonProperty = f.getDeclaredAnnotation(JsonProperty.class);

        if (jsonProperty != null && jsonProperty.value().equals("FIELD_1")) {
            return (String) f.get(dto);
        }

        // throw exception since passed field name is illegal
     }        
Run Code Online (Sandbox Code Playgroud)

在第二个中,它会容易得多:

    SampleDTO dto = new SampleDTO();
    // setup some values here

    String field1Value = (String) r.getClass().getField("field1").get(dto);
Run Code Online (Sandbox Code Playgroud)