[英]How to get Java's object field's name from JSON fields name
我想过滤掉响应中的一些字段。 过滤应在 Java 对象序列化为 JSON 之前完成。 考虑:
public class Entity {
@JsonProperty("some_property")
String someProperty;
@JsonProperty("nested_entity")
@OneToMany(mappedBy = "entity", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
NestedEntity nestedEntity;
// other fields for eg fieldA, fieldB
}
API 端点
get api/entity/{id}?fields=some_property,field_a
现在的问题是,在 o/p 中,我们应该只过滤掉 someProperty 和 fieldA。 喜欢
{
"some_property": "foo",
"field_a": "bar"
}
但是由于这些是 JSON 字段而不是 Java 对象字段,我无法通过反射过滤或获取这些字段。 有没有办法实现这一点,即基于 json 字段过滤 Java 对象?
仅供参考:在序列化之前过滤的优点是,除非需要这些字段,否则会保存惰性字段的数据库调用
提前致谢!
根据@robocode 的建议使用@JsonFilter
并支持空fields
或无字段过滤添加了 JacksonConfiguration
@JsonFilter("entityFilter")
public class Entity {
@JsonProperty("some_property")
String someProperty;
// other fields for eg fieldA, fieldB
}
@Configuration
public class JacksonConfiguration {
public JacksonConfiguration(ObjectMapper objectMapper) {
objectMapper.setFilterProvider(new SimpleFilterProvider().setFailOnUnknownId(false));
}
}
public class FieldMapper {
@SneakyThrows
public static Dto getFilteredFields(Dto make, String fields[]) {
ObjectMapper objectMapper = new ObjectMapper();
if(ArrayUtils.isNotEmpty(fields)) {
FilterProvider filters = new SimpleFilterProvider().addFilter(
"entityFilter", SimpleBeanPropertyFilter.filterOutAllExcept(fields)
);
objectMapper.setFilterProvider(filters);
} else {
objectMapper.setFilterProvider(new SimpleFilterProvider().setFailOnUnknownId(false));
}
JsonNode j = objectMapper.readTree(objectMapper.writeValueAsString(make));
return objectMapper.convertValue(j, Dto.class);
}
}
// controller code to get the dto for api/entity/{id}?fields=some_property,field_a
Dto filteredFields = getFilteredFields(dto, fields);
return filteredFields
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.