如何从 JSON 字段名称中获取 Java 的对象字段名称

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