以下是使用Spring Boot实现RESTful动态过滤嵌套对象字段的示例代码:

  1. 定义一个过滤器类,用于过滤嵌套对象的字段
public class NestedFieldFilter {

    public static void filter(Object object, String[] fieldsToKeep) {
        if (object == null) {
            return;
        }

        if (object instanceof Collection) {
            Collection collection = (Collection) object;
            for (Object item : collection) {
                filter(item, fieldsToKeep);
            }
        } else if (object instanceof Map) {
            Map map = (Map) object;
            for (Object key : map.keySet()) {
                Object value = map.get(key);
                filter(value, fieldsToKeep);
            }
        } else {
            Class<?> clazz = object.getClass();
            List<Field> fields = getAllFields(clazz);

            for (Field field : fields) {
                if (!Arrays.asList(fieldsToKeep).contains(field.getName())) {
                    setFieldNull(object, field);
                } else {
                    field.setAccessible(true);
                    try {
                        Object fieldValue = field.get(object);
                        filter(fieldValue, fieldsToKeep);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    private static List<Field> getAllFields(Class<?> clazz) {
        List<Field> fields = new ArrayList<>();
        while (clazz != null) {
            fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
            clazz = clazz.getSuperclass();
        }
        return fields;
    }

    private static void setFieldNull(Object object, Field field) {
        try {
            field.setAccessible(true);
            Object nullValue = null;
            field.set(object, nullValue);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
  1. 在控制器中使用过滤器进行嵌套对象字段的过滤
@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id, @RequestParam(required = false) String[] fields) {
        User user = userService.getUserById(id);
        if (fields != null && fields.length > 0) {
            NestedFieldFilter.filter(user, fields);
        }
        return user;
    }
}

在上面的代码中,我们使用了Spring Boot的注解@RestController和@RequestMapping来定义一个RESTful风格的控制器,并注入了一个UserService实例。getUser()方法接受一个用户ID和一个可选的字段数组(fields),用于指定要保留的嵌套对象的字段。如果fields参数不为空,则将调用NestedFieldFilter的filter方法来过滤User对象中的嵌套对象字段。

现在,我们可以访问/users/{id}接口,并使用fields参数来过滤嵌套对象的字段,例如:

GET /users/1?fields=id,name,profile.email,profile.phone

这将返回一个User对象,其中只包含id、name和profile对象的email和phone字段。


原文地址: https://www.cveoy.top/t/topic/7G4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录