gpt4 book ai didi

java自定义注解,用于修改getter方法的返回值

转载 作者:行者123 更新时间:2023-12-01 06:12:43 26 4
gpt4 key购买 nike

我的 spring mvc 项目中有一些实体。假设我有三个实体 A、B 和 C。A 有 B 和 C 的实例:

public class A {
...
public B b;
public B getB(){
return b;
}
public void setB(B b){
this.b = b;
}


public C c;
public C getC(){
return b;
}
public void setC(C c){
this.c = c;
}
}

我想在获取实例后对其进行修改。例如,我想在调用表单 A 时设置 B 的某个字段。我不想手动执行此操作。例如我想为此做一个注释。像这样的事情:

public class A {
...
public B b;

@MyCustomAnnotation
public B getB(){
return b;
}
public void setB(B b){
this.b = b;
}


public C c;

@MyCustomAnnotation
public C getC(){
return b;
}
public void setC(C c){
this.c = c;
}
}

我该怎么做?

最佳答案

为什么Spring MVC自定义注解?如果我理解正确的话,您想要拥有自己的注释,您可以将其应用于某些方法并执行一些逻辑。

创建您自己的注释,如下所示

使用 @Target = ElementType.METHOD 进行注释,如下 -

@Validation(validator = Validator.MYLOGIC)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{

int value();

}

有一个用于验证的枚举,如下所示

public enum Validator {

SOMEOTHERVALIDATION() {
// Some other validation here
},
MYLOGIC() {

// Have your business logic here

};
public abstract List<String> validate(Object value,
Map<String, Object> params, String variable);
}

有一个ValidationFactory,使用反射,获取注解并调用具体的验证逻辑

public class ValidationFactory {

public void validate(Object object) throws HealthcareValidationException {

List<String> exceptions = validateObject(object);
if (exceptions.size() != 0) {
throw new HealthcareValidationException(exceptions);
}
}

public List<String> validateObject(Object obj) {
List<String> validationResult = new ArrayList<String>();
for (Field field : obj.getClass().getDeclaredFields()) {
try {
validationResult.addAll(validateField(field, obj));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return validationResult;
}

protected static List<String> validateField(Field field, Object obj)
throws IllegalAccessException, InvocationTargetException {

Annotation[] annotations = field.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
Validation validationMarker = annotation.annotationType()
.getAnnotation(Validation.class);
if (validationMarker != null) {
Validator[] validators = validationMarker.validator();

for (Validator validator : validators) {

field.setAccessible(true);
String xmlFileld = field.getName();

validationExceptions.addAll(validator.validate(
field.get(obj), collectParams(annotation),
xmlFileld));
}
}
}
return validationExceptions;
}
}

导航流的面向方面编程

现在您已准备好自定义注释。您可以在任何方法中使用此注释。接下来,您可以使用 Spring 面向方面编程将流程导航到注释逻辑。

示例 - 假设您想要对特定包中的所有方法或名称以 insert* 开头的所有方法进行相交

@Before("execution(* com.learning.application.bo.*.insert*(..))")
public void validateInsert(JoinPoint joinpoint)
throws HealthcareValidationException {

validationFactory = new ValidationFactory();
Object[] args = joinpoint.getArgs();
for (int i = 0; i < args.length; i++) {
validationFactory.validate(args[i]);
}
}

仅此而已!希望这可以帮助。

关于java自定义注解,用于修改getter方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31824903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com