自定义枚举拦截工具

该博客介绍了一个在Spring框架中使用AOP(面向切面编程)实现的参数过滤和验证的组件。它主要关注于处理带有`Trim`注解的字段,通过检查方法参数上的`Validated`注解来决定是否需要过滤。`Trim`注解用于确保输入的字符串已去除前导和尾随空白。博客还包含了`TrimValidator`类,实现了约束验证以检查字符串是否为空。此实现有助于提高代码的整洁性和输入数据的准确性。
摘要由CSDN通过智能技术生成

package com.jjfinder.retail.admin.aspect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import com.jjfinder.retail.common.annotation.Trim;
import com.jjfinder.retail.common.model.BaseModel;

/** 
 * @author salted fish
 * @date 2018年12月10日 
 */
@Component
@Aspect
@Order(4)
public class ParamFilterAspect {
	public static final String SET = "set";
	public static final String GET = "get";
	@Around("execution(* com.jjfinder.retail.admin.*.controller..*(..))")
	public Object paramFilter(ProceedingJoinPoint jp) throws Throwable {
		Object[] args = jp.getArgs();
		for (Object obj : args) {
			if (BaseModel.class.isAssignableFrom(obj.getClass())) {
				Field[] fields = obj.getClass().getDeclaredFields();
				for (Field field : fields) {
					Annotation[] annotations = field.getAnnotations();
					for (Annotation annotation : annotations) {
						if (Trim.class.isAssignableFrom(annotation.getClass())) {
							if (isNeedFilter(jp, annotation)) {
								Method setMethod = obj.getClass().getMethod(getFieldSetMethod(field.getName()), String.class);
								Method getMethod = obj.getClass().getMethod(getFieldGetMethod(field.getName()));
								String value = (String)getMethod.invoke(obj);
								setMethod.invoke(obj, value.trim());
							}
						}
					}
				}
			}
		}
		Object result = jp.proceed(args);
		return result;
	}

	public static Boolean isNeedFilter(ProceedingJoinPoint jp, Annotation annotation) {
		Class validClass = null;
		MethodSignature signature = (MethodSignature) jp.getSignature();
		Method method = signature.getMethod();
		Parameter[] parameters = method.getParameters();
		for (Parameter parameter : parameters) {
			if (parameter.isAnnotationPresent(Validated.class)) {
				Validated validate = parameter.getAnnotation(Validated.class);
				validClass = validate.value()[0];
				Trim fieldAnnotation = (Trim) annotation;
				Class<?>[] groupClass = fieldAnnotation.groups();
				if (Objects.isNull(validClass) && (Objects.isNull(groupClass) || groupClass.length == 0)) return true;
				return Arrays.asList(groupClass).contains(validClass);
			}
		}
		return false;
	}

	public static String getFieldSetMethod(String field) {
		return SET + StringUtils.capitalize(field);
	}

	public static String getFieldGetMethod(String field) {
		return GET + StringUtils.capitalize(field);
	}
}
/** 
* @author salted fish
* @date 2018年12月10日 
*/
@Documented
@Constraint(validatedBy = TrimValidator.class)
@Target({FIELD})
@Retention(RUNTIME)
@ReportAsSingleViolation
@NotNull
public @interface Trim {
    String message() default "{org.hibernate.validator.constraints.NotBlank.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}
/** 
* @author salted fish
* @date 2018年12月10日 
*/
public class TrimValidator implements ConstraintValidator<Trim, CharSequence> {
	
	@Override
	public void initialize(Trim annotation) {
	}

	@Override
	public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
		if (charSequence == null) {
			return true;
		}
		return charSequence.toString().trim().length() > 0;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java自定义注解是指在Java语言中可以通过编写代码来定义自己的注解。自定义注解可以提供一些额外的元数据信息,用于标记和描述Java代码中的某个元素。自定义注解可以用于类、方法、属性等各个层面。 实现自定义注解步骤如下: 1. 使用@Retention注解指定注解的保留策略,默认为RetentionPolicy.CLASS。可选的保留策略有三种:RetentionPolicy.SOURCE、RetentionPolicy.CLASS和RetentionPolicy.RUNTIME。 2. 使用@Target注解指定注解的作用目标,默认可以用于所有的Java元素。可选的作用目标包括ElementType.TYPE(类、接口、枚举等)、ElementType.FIELD(字段、枚举常量等)、ElementType.METHOD(方法)、ElementType.PARAMETER(方法参数)、ElementType.CONSTRUCTOR(构造方法)、ElementType.LOCAL_VARIABLE(局部变量)等。 3. 使用@interface关键字定义注解,并定义注解的属性。注解的属性以无参无异常抛出的方法的形式定义,可以指定默认值。 4. 在需要使用注解的地方使用自定义注解。 自定义注解可以携带信息,这些信息可以在运行时通过反射获取,对注解进行解析和处理。自定义注解可以用于编写各种工具、框架和库,来增强程序的扩展性和灵活性。 实现自定义注解的一个典型应用场景是在Spring框架中的依赖注入(DI)和面向切面编程(AOP)中。通过自定义注解,可以标记需要注入的Bean,或者标记需要进行切面拦截的方法,从而实现依赖注入和切面编程的功能。 总的来说,Java自定义注解是Java语言提供的一种灵活的元编程机制,可以通过注解增加程序的可读性和可维护性,同时也可以用于实现一些特定的功能,如依赖注入和切面编程等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值