feat: 抽离公共注解工具类

This commit is contained in:
wangyu 2024-07-16 11:45:06 +08:00
parent 764d25f15c
commit eb4b732416
19 changed files with 94 additions and 35 deletions

28
flyfish-bean/pom.xml Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>dev.flyfish.framework</groupId>
<artifactId>flyfish-framework</artifactId>
<version>2.0.0</version>
</parent>
<artifactId>flyfish-bean</artifactId>
<name>flyfish-parser</name>
<description>飞鱼解析器</description>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1 @@
package dev.flyfish.framework.beans.enums;

View File

@ -0,0 +1 @@
package dev.flyfish.framework.beans.meta;

View File

@ -6,6 +6,7 @@ import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
/** /**
* 基于spring annotations最高级封装 * 基于spring annotations最高级封装
@ -17,6 +18,16 @@ import java.lang.annotation.Annotation;
*/ */
public interface BeanPropertyAnnotations { public interface BeanPropertyAnnotations {
/**
* 来自反射
*
* @param annotated 字段
* @return 结果
*/
static BeanPropertyAnnotations from(AnnotatedElement annotated) {
return new SimpleBeanPropertyAnnotations(annotated);
}
/** /**
* 判断是否有某个注解 * 判断是否有某个注解
* *
@ -84,4 +95,17 @@ public interface BeanPropertyAnnotations {
* @return 结果 * @return 结果
*/ */
<A extends Annotation, E> BeanPropertyAnnotationBatchChain<A, E> batchEmpty(); <A extends Annotation, E> BeanPropertyAnnotationBatchChain<A, E> batchEmpty();
/**
* 强制类型转换
*
* @param bean 入参
* @param <T> 入参泛型
* @param <R> 出参泛型
* @return 结果
*/
@SuppressWarnings("unchecked")
static <T, R> R cast(T bean) {
return (R) bean;
}
} }

View File

@ -6,17 +6,18 @@ import dev.flyfish.framework.beans.meta.parser.chain.impl.EmptyAnnotationBatchCh
import dev.flyfish.framework.beans.meta.parser.chain.impl.EmptyAnnotationChain; import dev.flyfish.framework.beans.meta.parser.chain.impl.EmptyAnnotationChain;
import dev.flyfish.framework.beans.meta.parser.chain.impl.SimpleAnnotationBatchChain; import dev.flyfish.framework.beans.meta.parser.chain.impl.SimpleAnnotationBatchChain;
import dev.flyfish.framework.beans.meta.parser.chain.impl.SimpleAnnotationChain; import dev.flyfish.framework.beans.meta.parser.chain.impl.SimpleAnnotationChain;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.data.util.CastUtils; import org.springframework.util.CollectionUtils;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.Field; import java.lang.reflect.AnnotatedElement;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations.cast;
/** /**
* bean属性注解容器 * bean属性注解容器
* *
@ -24,14 +25,14 @@ import java.util.stream.Collectors;
*/ */
public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations { public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations {
private final Field field; private final AnnotatedElement field;
private final MergedAnnotations annotations; private final MergedAnnotations annotations;
private final EmptyAnnotationChain<? extends Annotation, ?> emptyChain = new EmptyAnnotationChain<>(this); private final EmptyAnnotationChain<? extends Annotation, ?> emptyChain = new EmptyAnnotationChain<>(this);
private final EmptyAnnotationBatchChain<? extends Annotation, ?> emptyBatchChain = new EmptyAnnotationBatchChain<>(this); private final EmptyAnnotationBatchChain<? extends Annotation, ?> emptyBatchChain = new EmptyAnnotationBatchChain<>(this);
private boolean last; private boolean last;
public SimpleBeanPropertyAnnotations(Field field) { SimpleBeanPropertyAnnotations(AnnotatedElement field) {
this.field = field; this.field = field;
this.annotations = null == field ? MergedAnnotations.from() : MergedAnnotations.from(field); this.annotations = null == field ? MergedAnnotations.from() : MergedAnnotations.from(field);
} }
@ -98,7 +99,7 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations {
List<MergedAnnotation<A>> values = this.annotations.stream(annotationType) List<MergedAnnotation<A>> values = this.annotations.stream(annotationType)
.filter(MergedAnnotation::isPresent) .filter(MergedAnnotation::isPresent)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(values)) { if (!CollectionUtils.isEmpty(values)) {
return new SimpleAnnotationBatchChain<>(this.last(true), values); return new SimpleAnnotationBatchChain<>(this.last(true), values);
} }
} }
@ -135,7 +136,7 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations {
*/ */
@Override @Override
public <A extends Annotation, E> BeanPropertyAnnotationChain<A, E> empty() { public <A extends Annotation, E> BeanPropertyAnnotationChain<A, E> empty() {
return CastUtils.cast(emptyChain); return cast(emptyChain);
} }
/** /**
@ -144,7 +145,8 @@ public class SimpleBeanPropertyAnnotations implements BeanPropertyAnnotations {
* @return 结果 * @return 结果
*/ */
@Override @Override
public <A extends Annotation, E> BeanPropertyAnnotationBatchChain<A, E> batchEmpty() { public <A extends Annotation, E> BeanPropertyAnnotationBatchChain<A, E> batchEmpty() {
return CastUtils.cast(emptyBatchChain); return cast(emptyBatchChain);
} }
} }

View File

@ -2,7 +2,6 @@ package dev.flyfish.framework.beans.meta.parser.chain.impl;
import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations;
import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationBatchChain; import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationBatchChain;
import org.springframework.data.util.CastUtils;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.Collections; import java.util.Collections;
@ -12,6 +11,8 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import static dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations.cast;
/** /**
* 单例的空实现 * 单例的空实现
* *
@ -32,7 +33,7 @@ public class EmptyAnnotationBatchChain<A extends Annotation, T> extends BasicAnn
*/ */
@Override @Override
public <R> BeanPropertyAnnotationBatchChain<A, R> map(Function<T, R> mapper) { public <R> BeanPropertyAnnotationBatchChain<A, R> map(Function<T, R> mapper) {
return CastUtils.cast(this); return cast(this);
} }
/** /**

View File

@ -2,7 +2,6 @@ package dev.flyfish.framework.beans.meta.parser.chain.impl;
import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations;
import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationChain; import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationChain;
import org.springframework.data.util.CastUtils;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -10,6 +9,8 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import static dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations.cast;
/** /**
* 单例的空实现 * 单例的空实现
* *
@ -31,7 +32,7 @@ public class EmptyAnnotationChain<A extends Annotation, T> extends BasicAnnotati
*/ */
@Override @Override
public <R> BeanPropertyAnnotationChain<A, R> map(Function<T, R> mapper) { public <R> BeanPropertyAnnotationChain<A, R> map(Function<T, R> mapper) {
return CastUtils.cast(this); return cast(this);
} }
/** /**

View File

@ -2,9 +2,8 @@ package dev.flyfish.framework.beans.meta.parser.chain.impl;
import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations;
import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationBatchChain; import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationBatchChain;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.data.util.CastUtils; import org.springframework.util.CollectionUtils;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.Collections; import java.util.Collections;
@ -16,6 +15,8 @@ import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations.cast;
/** /**
* 简单的批量注解链式实现 * 简单的批量注解链式实现
* *
@ -50,8 +51,8 @@ public class SimpleAnnotationBatchChain<A extends Annotation, T> extends BasicAn
return parent.batchEmpty(); return parent.batchEmpty();
} }
this.mapped = true; this.mapped = true;
this.values = CastUtils.cast(list); this.values = cast(list);
return CastUtils.cast(this); return cast(this);
} }
/** /**

View File

@ -3,7 +3,6 @@ package dev.flyfish.framework.beans.meta.parser.chain.impl;
import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations;
import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationChain; import dev.flyfish.framework.beans.meta.parser.chain.BeanPropertyAnnotationChain;
import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.data.util.CastUtils;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -11,6 +10,8 @@ import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.function.Supplier; import java.util.function.Supplier;
import static dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations.cast;
/** /**
* 简单的注解链 * 简单的注解链
* *
@ -40,8 +41,8 @@ public class SimpleAnnotationChain<A extends Annotation, T> extends BasicAnnotat
if (null == value) { if (null == value) {
return parent.empty(); return parent.empty();
} }
this.value = CastUtils.cast(value); this.value = cast(value);
return CastUtils.cast(this); return cast(this);
} }
/** /**

View File

@ -120,7 +120,6 @@ public class User extends AuditDomain implements IUser {
@Transient @Transient
private Object detail; private Object detail;
@Override @Override
public User toUser() { public User toUser() {
return this; return this;

View File

@ -17,6 +17,11 @@
<artifactId>flyfish-data-common</artifactId> <artifactId>flyfish-data-common</artifactId>
</dependency> </dependency>
<dependency>
<groupId>dev.flyfish.framework</groupId>
<artifactId>flyfish-bean</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>

View File

@ -8,6 +8,7 @@ import dev.flyfish.framework.validation.annotations.Money;
import dev.flyfish.framework.validation.annotations.Phone; import dev.flyfish.framework.validation.annotations.Phone;
import dev.flyfish.framework.validation.annotations.UniqueField; import dev.flyfish.framework.validation.annotations.UniqueField;
import dev.flyfish.framework.validation.enums.PhoneType; import dev.flyfish.framework.validation.enums.PhoneType;
import jakarta.validation.constraints.*;
import lombok.Getter; import lombok.Getter;
import lombok.val; import lombok.val;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
@ -17,7 +18,6 @@ import org.hibernate.validator.constraints.URL;
import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations; import org.springframework.core.annotation.MergedAnnotations;
import jakarta.validation.constraints.*;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;

View File

@ -7,13 +7,11 @@ import dev.flyfish.framework.annotations.*;
import dev.flyfish.framework.beans.enums.ValidationCandidate; import dev.flyfish.framework.beans.enums.ValidationCandidate;
import dev.flyfish.framework.beans.meta.builtin.BeanUris; import dev.flyfish.framework.beans.meta.builtin.BeanUris;
import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations; import dev.flyfish.framework.beans.meta.parser.BeanPropertyAnnotations;
import dev.flyfish.framework.beans.meta.parser.SimpleBeanPropertyAnnotations;
import dev.flyfish.framework.domain.base.Qo; import dev.flyfish.framework.domain.base.Qo;
import dev.flyfish.framework.domain.base.Vo; import dev.flyfish.framework.domain.base.Vo;
import dev.flyfish.framework.utils.ReflectionUtils; import dev.flyfish.framework.utils.ReflectionUtils;
import dev.flyfish.framework.utils.StringFormats; import dev.flyfish.framework.utils.StringFormats;
import dev.flyfish.framework.validation.annotations.Money; import dev.flyfish.framework.validation.annotations.Money;
import dev.flyfish.framework.annotations.*;
import lombok.Data; import lombok.Data;
import lombok.val; import lombok.val;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@ -119,7 +117,7 @@ public class BeanProperty {
boolean strict = Qo.class.isAssignableFrom(beanClass) || Vo.class.isAssignableFrom(beanClass); boolean strict = Qo.class.isAssignableFrom(beanClass) || Vo.class.isAssignableFrom(beanClass);
// 尝试获取field // 尝试获取field
Field field = FieldUtils.getField(beanClass, descriptor.getName(), true); Field field = FieldUtils.getField(beanClass, descriptor.getName(), true);
BeanPropertyAnnotations annotations = new SimpleBeanPropertyAnnotations(field); BeanPropertyAnnotations annotations = BeanPropertyAnnotations.from(field);
// 判断是否需要跳过启用严格模式并未标记的属性将直接跳过 // 判断是否需要跳过启用严格模式并未标记的属性将直接跳过
boolean skip = null == field || !annotations.isPresent(Property.class); boolean skip = null == field || !annotations.isPresent(Property.class);
if (skip && strict) { if (skip && strict) {

View File

@ -1,10 +0,0 @@
package dev.flyfish.framework.beans.meta.parser;
/**
* bean属性注解解析器
* @author wangyu
*/
public class BeanPropertyAnnotationParser {
}

View File

@ -17,7 +17,7 @@
</parent> </parent>
<properties> <properties>
<revision>2.0.0</revision> <revision>2.0.1</revision>
<docker.image.prefix>flyfish</docker.image.prefix> <docker.image.prefix>flyfish</docker.image.prefix>
<docker.plugin.version>0.27.2</docker.plugin.version> <docker.plugin.version>0.27.2</docker.plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@ -65,6 +65,7 @@
<module>flyfish-form</module> <module>flyfish-form</module>
<module>flyfish-approval</module> <module>flyfish-approval</module>
<module>flyfish-backup</module> <module>flyfish-backup</module>
<module>flyfish-bean</module>
</modules> </modules>
<repositories> <repositories>
@ -120,6 +121,12 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>dev.flyfish.framework</groupId>
<artifactId>flyfish-bean</artifactId>
<version>${revision}</version>
</dependency>
<dependency> <dependency>
<groupId>dev.flyfish.framework</groupId> <groupId>dev.flyfish.framework</groupId>
<artifactId>flyfish-data-relational</artifactId> <artifactId>flyfish-data-relational</artifactId>