QueryNullCheckAspect.java 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package com.backendsys.aspect;
  2. import com.backendsys.utils.response.Result;
  3. import com.backendsys.utils.response.ResultEnum;
  4. import org.aspectj.lang.ProceedingJoinPoint;
  5. import org.aspectj.lang.annotation.Around;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.context.ApplicationContext;
  9. import org.springframework.stereotype.Component;
  10. import java.lang.reflect.Field;
  11. import java.lang.reflect.Method;
  12. import java.util.Map;
  13. /**
  14. * 仅判断非空,可以使用此切面方法
  15. *
  16. * 多判断,不适合此方法,比如:
  17. * - 非空
  18. * - 非本人
  19. * - 非超级管理员
  20. */
  21. @Aspect
  22. @Component
  23. public class QueryNullCheckAspect {
  24. @Autowired
  25. private ApplicationContext applicationContext;
  26. private static Map<String, Object> queryResult;
  27. /**
  28. * 自定注解:@QueryNullCheck
  29. * 使用方法:通过ID查询记录是否存在 (适用于 详情/改/删)
  30. * @QueryNullCheck(serviceClass = B2cGoodUnitService.class, serviceMethod = "queryGoodUnitDetail", argField = "good_unit_id", message = "商品单位不存在")
  31. * public Result deleteGoodUnit(@Validated(B2cGoodUnitDTO.Delete.class) @RequestBody B2cGoodUnitDTO b2cGoodUnitDTO) {
  32. *
  33. * 注意:入参必须是实体类 (除 GET 外,POST/PUT/DELETE 需要加 @RequestBody)
  34. */
  35. @SuppressWarnings({"rawtypes", "unchecked"})
  36. @Around("@annotation(queryNullCheck)")
  37. public Object handleQueryNullCheck(ProceedingJoinPoint joinPoint, QueryNullCheck queryNullCheck) throws Throwable {
  38. Object[] args = joinPoint.getArgs();
  39. // 从上下文中获得 service class
  40. Class serviceClass = queryNullCheck.serviceClass();
  41. Object service = applicationContext.getBean(serviceClass);
  42. String serviceMethod = queryNullCheck.serviceMethod();
  43. String argField = queryNullCheck.argField();
  44. String message = queryNullCheck.message();
  45. // 获取参数值
  46. Object argValue = null;
  47. for (Object arg : args) {
  48. Field field = arg.getClass().getDeclaredField(argField);
  49. field.setAccessible(true);
  50. argValue = field.get(arg);
  51. if (argValue != null) { break; }
  52. }
  53. /**
  54. * 参数为空 (例如 user_id = null) 时,校验在实体类那里进行,此处不再进行校验
  55. */
  56. if (argValue != null) {
  57. System.out.println("---");
  58. for(Method method : service.getClass().getMethods()) {
  59. System.out.println("method = " + method);
  60. }
  61. System.out.println("---");
  62. System.out.println("service.getClass() = " + service.getClass());
  63. System.out.println("serviceMethod = " + serviceMethod);
  64. System.out.println("argValue.getClass() = " + argValue.getClass());
  65. // [反向代理] 执行记录非空查询的 service 方法
  66. queryResult = (Map<String, Object>) service.getClass().getMethod(serviceMethod, argValue.getClass()).invoke(service, argValue);
  67. // System.out.println("queryResult = " + queryResult);
  68. if (queryResult == null) {
  69. return Result.error(ResultEnum.DATABASE_OPERATION_FAILED.getCode(), message);
  70. }
  71. }
  72. return joinPoint.proceed();
  73. }
  74. /**
  75. * 获得该次查询的结果:
  76. * QueryNullCheckAspect.getQueryResult()
  77. */
  78. public static Map<String, Object> getQueryResult() {
  79. return queryResult;
  80. }
  81. }