修复镜像属性会被重复包装的问题

This commit is contained in:
huangchengxing 2022-07-13 15:11:24 +08:00
parent da7dbc2ba3
commit cf99ec14ca
2 changed files with 58 additions and 1 deletions

View File

@ -44,7 +44,9 @@ public abstract class AbstractLinkAnnotationPostProcessor implements Synthesized
}
final AnnotationAttribute linkedAttribute = linkedAnnotation.getAttributes().get(link.attribute());
// 处理
processLinkedAttribute(aggregator, link, synthesizedAnnotation, originalAttribute,
processLinkedAttribute(
aggregator, link,
synthesizedAnnotation, synthesizedAnnotation.getAttributes().get(originalAttributeName),
linkedAnnotation, linkedAttribute
);
});

View File

@ -2,6 +2,7 @@ package cn.hutool.core.annotation;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
/**
* <p>用于处理注解对象中带有{@link Link}注解{@link Link#type()}{@link RelationType#MIRROR_FOR}的属性<br>
@ -47,6 +48,17 @@ public class MirrorLinkAnnotationPostProcessor extends AbstractLinkAnnotationPos
SynthesizedAnnotationAggregator aggregator, Link annotation,
SynthesizedAnnotation originalAnnotation, AnnotationAttribute originalAttribute,
SynthesizedAnnotation linkedAnnotation, AnnotationAttribute linkedAttribute) {
// 镜像属性必然成对出现因此此处必定存在三种情况
// 1.两属性都不为镜像属性此时继续进行后续处理
// 2.两属性都为镜像属性并且指向对方此时无需后续处理
// 3.两属性仅有任意一属性为镜像属性此时镜像属性必然未指向当前原始属性此时应该抛出异常
if (originalAttribute instanceof MirroredAnnotationAttribute
|| linkedAttribute instanceof MirroredAnnotationAttribute) {
checkMirrored(originalAttribute, linkedAttribute);
return;
}
// 校验镜像关系
checkMirrorRelation(annotation, originalAttribute, linkedAttribute);
// 包装这一对镜像属性并替换原注解中的对应属性
@ -56,6 +68,49 @@ public class MirrorLinkAnnotationPostProcessor extends AbstractLinkAnnotationPos
linkedAnnotation.setAttribute(annotation.attribute(), mirroredTargetAttribute);
}
/**
* 检查映射关系是否正确
*/
private void checkMirrored(AnnotationAttribute original, AnnotationAttribute mirror) {
final boolean originalAttributeMirrored = original instanceof MirroredAnnotationAttribute;
final boolean mirrorAttributeMirrored = mirror instanceof MirroredAnnotationAttribute;
// 校验通过
final boolean passed = originalAttributeMirrored && mirrorAttributeMirrored
&& ObjectUtil.equals(((MirroredAnnotationAttribute)original).getLinked(), ((MirroredAnnotationAttribute)mirror).getOriginal());
if (passed) {
return;
}
// 校验失败拼装异常信息用于抛出异常
String errorMsg;
// 原始字段已经跟其他字段形成镜像
if (originalAttributeMirrored && !mirrorAttributeMirrored) {
errorMsg = StrUtil.format(
"attribute [{}] cannot mirror for [{}], because it's already mirrored for [{}]",
original.getAttribute(), mirror.getAttribute(), ((MirroredAnnotationAttribute)original).getLinked()
);
}
// 镜像字段已经跟其他字段形成镜像
else if (!originalAttributeMirrored && mirrorAttributeMirrored) {
errorMsg = StrUtil.format(
"attribute [{}] cannot mirror for [{}], because it's already mirrored for [{}]",
mirror.getAttribute(), original.getAttribute(), ((MirroredAnnotationAttribute)mirror).getLinked()
);
}
// 两者都形成了镜像但是都未指向对方理论上不会存在该情况
else {
errorMsg = StrUtil.format(
"attribute [{}] cannot mirror for [{}], because [{}] already mirrored for [{}] and [{}] already mirrored for [{}]",
mirror.getAttribute(), original.getAttribute(),
mirror.getAttribute(), ((MirroredAnnotationAttribute)mirror).getLinked(),
original.getAttribute(), ((MirroredAnnotationAttribute)original).getLinked()
);
}
throw new IllegalArgumentException(errorMsg);
}
/**
* 基本校验
*/