From 81c27d6856db6204a2406110a041e7cfdda2b450 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Tue, 5 Jan 2021 17:28:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0bean=E8=AF=BB?= =?UTF-8?q?=E5=8F=96=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/beans/meta/BeanController.java | 40 ++++++++++++++++ .../framework/beans/meta/BeanProperty.java | 48 +++++++++++++++++++ .../beans/meta/BeanPropertyType.java | 44 +++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanController.java create mode 100644 flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java create mode 100644 flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanPropertyType.java diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanController.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanController.java new file mode 100644 index 0000000..9364506 --- /dev/null +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanController.java @@ -0,0 +1,40 @@ +package com.flyfish.framework.beans.meta; + +import com.flyfish.framework.bean.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * bean控制器,可以通过类直接返回bean信息 + * + * @author wangyu + */ +@RestController +@RequestMapping("beans") +@Slf4j +public class BeanController { + + /** + * 通过类标识返回bean信息 + * + * @return 结果 + */ + @GetMapping("") + public Result> beanInfo(String className) { + try { + return Result.ok(Arrays.stream(BeanUtils.getPropertyDescriptors(Class.forName(className))) + .map(BeanProperty::form) + .collect(Collectors.toList())); + } catch (ClassNotFoundException e) { + log.error(e.getMessage(), e); + return Result.error(e.getMessage()); + } + } +} diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java new file mode 100644 index 0000000..31ddcff --- /dev/null +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanProperty.java @@ -0,0 +1,48 @@ +package com.flyfish.framework.beans.meta; + +import lombok.Data; +import org.springframework.beans.BeanUtils; + +import java.beans.PropertyDescriptor; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * bean的属性描述 + * 对应js的类型 + * + * @author wangyu + */ +@Data +public class BeanProperty { + + // 属性名称 + private String name; + + // bean属性的类型,js类型 + private BeanPropertyType type; + + // 类型为object时,拥有子表单 + private List children; + + /** + * 来自属性解释器构造 + * 支持对象嵌套 + * + * @param descriptor 解释器 + * @return 结果 + */ + public static BeanProperty form(PropertyDescriptor descriptor) { + BeanProperty property = new BeanProperty(); + property.setName(descriptor.getName()); + property.setType(BeanPropertyType.of(descriptor.getPropertyType())); + if (property.getType() == BeanPropertyType.OBJECT) { + List children = Arrays.stream(BeanUtils.getPropertyDescriptors(descriptor.getPropertyType())) + .map(BeanProperty::form) + .collect(Collectors.toList()); + property.setChildren(children); + } + return property; + } +} diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanPropertyType.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanPropertyType.java new file mode 100644 index 0000000..1ca226d --- /dev/null +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/BeanPropertyType.java @@ -0,0 +1,44 @@ +package com.flyfish.framework.beans.meta; + +import lombok.Getter; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * bean属性的类型 + * 包含java类型到js的映射 + * 我们通过类型自动解析bean的缺省控件,并自动映射 + * @author wangyu + */ +@Getter +public enum BeanPropertyType { + + STRING("String", CharSequence.class), + NUMBER("Number", Number.class), + BOOLEAN("Boolean", Boolean.class), + DATE("Date", Date.class), + ENUM("Enum", Enum.class), + LIST("Array", Collection.class), + OBJECT("Object", Object.class); + + BeanPropertyType(String name, Class ...classes) { + this.name = name; + this.classes = Arrays.asList(classes); + } + + private final String name; + + private final List> classes; + + public static BeanPropertyType of(Class clazz) { + for (BeanPropertyType type : values()) { + if (type.classes.stream().anyMatch(item -> item.isAssignableFrom(clazz))) { + return type; + } + } + return null; + } +}