在Spring Boot中的AOP和反射的方式实现RESTful动态过滤嵌套对象字段且无论是否为null值只有请求参数需要都要返回并给出请求案例包含url
和请求参数。
- 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);
}
- 反射实现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);
}
- 请求案例:
请求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 著作权归作者所有。请勿转载和采集!