在 Spring MVC GET 请求中将 Json 属性名称转换为实体 属性 名称

Converting Json attribute name to entity property name in a Spring MVC GET request

您好,我有一个应用程序正在使用 SpringDataNeo4j,Spring MVC ... 我有以下 类 作为示例。一个是实体,另一个是 JSON 对象。

@NodeEntity(label="MyBean")
public class MyBean() {

    @Property(name = "my_name")
    String my_name;
    @Property(name = "last_modified_by")
    String last_modified_by;

    //setter & getters
}

.

@JsonRootName("myBean")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class MyBeanData {

    String myName;
    String lastModifiedBy;

    //setter getters
}

这是我的 spring mvc 控制器中的请求处理程序:

@RequestMapping(value = "/test", method = RequestMethod.GET)
public List<MyBeanData> getMyBeans(@RequestParam(name = "sortDir", required = false) String sortDir,
        @RequestParam(name = "sortProp", required = false) String sortProp){

    //execute the Custom query to get all mybeans sorted by sortProp
}

现在我的问题是 "sortProp" 中使用的 属性 名称是 json 对象属性名称,例如 "lastModifiedBy"...排序查询不起作用使用 json 属性名称,它仅在我使用实体 属性 名称时才有效。在执行查询之前,是否有一种简单明了的方法将单个 json 属性名称转换为相应的实体 属性 名称?如注释?我不想在有这么多 if else 的实体中添加如下所示的转换器方法。

public String converter(String sortProp){
    if("lastModifiedBy".equals(sortPro)){
        return "last_modified_by"
    }
}

首先不需要用很多if/elses即使要反复比较字符串,也可以switch on strings:

 switch (sortPro) {
     case "lastModifiedBy": return "last_modified_by";
     // ...
 }

但是,存储映射和进行转换的最简单方法是使用 Map<String, String>:

private static final Map<String, String> SORT_FIELD_MAP;

static {
    Map<String, String> sortFieldMap = new HashMap<>();
    sortFieldMap.put("lastModifiedBy", "last_modified_by");
    // ...
    SORT_FIELD_MAP = Collections.unmodifiableMap(sortFieldMap);
}

public String converter(String sortProp) {
    return SORT_FIELD_MAP.get(sortProp);
}

(或使用来自 Guava 的不可变集合或等价物)

我发布这个答案只是作为 Frank 建议的替代实施。

所以这是我执行的步骤: 使用此处的 Reflection library,我创建了一个地图,其中:

  • Key is --> 所有用@属性
  • 注释的字段的名称
  • 值为-->所有@属性s
  • 的属性值

BeanPackage是我们要扫描的类的包路径

 @PostConstruct
private void init() {
    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
    classLoadersList.add(ClasspathHelper.contextClassLoader());
    classLoadersList.add(ClasspathHelper.staticClassLoader());

    Reflections reflections = new Reflections(new ConfigurationBuilder()
            .setScanners(
                    new SubTypesScanner(false /* don't exclude Object.class */),
                    new ResourcesScanner(),
                    new FieldAnnotationsScanner())
            .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
            .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(beanPackage))));

    Set<Field> fields = reflections.getFieldsAnnotatedWith(Property.class);
     fields.forEach(field -> jsonToEntityMap.put(field.getName(), field.getAnnotation(Property.class).name()));