在 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()));
您好,我有一个应用程序正在使用 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()));