和请求参数。

  1. AOP实现RESTful动态过滤嵌套对象字段

首先定义一个注解 @DynamicFilter,用于标记需要进行动态过滤的方法:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DynamicFilter {
    String[] value() default {};
}

在定义一个切面类 DynamicFilterAspect,用于在方法执行前进行动态过滤:

@Aspect
@Component
public class DynamicFilterAspect {
 
    @Autowired
    private ObjectMapper objectMapper;
 
    @Around("@annotation(com.example.demo.annotation.DynamicFilter)")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
 
        // 获取需要过滤的字段
        String[] fields = request.getParameterValues("fields");
 
        // 执行被标记的方法
        Object result = joinPoint.proceed();
        if (fields != null && fields.length > 0) {
            // 进行动态过滤
            String json = objectMapper.writeValueAsString(result);
            JsonNode rootNode = objectMapper.readTree(json);
            for (String field : fields) {
                String[] fieldsArray = field.split("\\.");
                JsonNode node = rootNode;
                for (String subField : fieldsArray) {
                    node = node.get(subField);
                    if (node == null) {
                        break;
                    }
                }
                if (node != null) {
                    ((ObjectNode) node).removeAll();
                }
            }
            result = objectMapper.readValue(rootNode.toString(), result.getClass());
        }
        return result;
    }
}

在需要动态过滤的方法上加上 @DynamicFilter 注解:

@GetMapping("/users/{id}")
@DynamicFilter({"address.city", "address.country"})
public User getUserById(@PathVariable Long id) {
    return userService.getUserById(id);
}
  1. 反射实现RESTful动态过滤嵌套对象字段

定义一个工具类 DynamicFilterUtil,用于进行动态过滤:

public class DynamicFilterUtil {
 
    public static <T> T dynamicFilter(T object, String[] fields) throws Exception {
        if (fields != null && fields.length > 0) {
            ObjectMapper objectMapper = new ObjectMapper();
            String json = objectMapper.writeValueAsString(object);
            JsonNode rootNode = objectMapper.readTree(json);
            for (String field : fields) {
                String[] fieldsArray = field.split("\\.");
                JsonNode node = rootNode;
                for (String subField : fieldsArray) {
                    node = node.get(subField);
                    if (node == null) {
                        break;
                    }
                }
                if (node != null) {
                    ((ObjectNode) node).removeAll();
                }
            }
            object = objectMapper.readValue(rootNode.toString(), (Class<T>) object.getClass());
        }
        return object;
    }
 
}

在需要动态过滤的地方调用该工具类:

@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id, @RequestParam(required = false) String[] fields) throws Exception {
    User user = userService.getUserById(id);
    return DynamicFilterUtil.dynamicFilter(user, fields);
}
  1. 请求案例:

请求URL:http://localhost:8080/users/1?fields=name,address.city

请求参数:fields=name,address.city

返回结果:

{
    "id": 1,
    "name": "Alice",
    "address": {
        "city": "New York",
        "state": "NY"
    }
}

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

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