From 7baf60e8a75963404e8a496200b6643798674080 Mon Sep 17 00:00:00 2001 From: songyinyin Date: Sat, 21 Oct 2023 20:55:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E7=94=9F=E7=BC=96=E8=AF=91=EF=BC=9A?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=8E=A5=E5=8F=A3=E5=8F=82=E6=95=B0=E5=92=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/NeutrinoRuntimeNativeRegistrar.java | 84 ++++++++++++++++--- 1 file changed, 71 insertions(+), 13 deletions(-) diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/NeutrinoRuntimeNativeRegistrar.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/NeutrinoRuntimeNativeRegistrar.java index 545823ac..14ebffc9 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/NeutrinoRuntimeNativeRegistrar.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/NeutrinoRuntimeNativeRegistrar.java @@ -2,6 +2,9 @@ package org.dromara.neutrinoproxy.server.base; import org.apache.ibatis.io.DefaultVFS; import org.apache.ibatis.io.JBoss6VFS; +import org.apache.ibatis.solon.MybatisAdapter; +import org.apache.ibatis.solon.integration.MybatisAdapterDefault; +import org.apache.ibatis.solon.integration.MybatisAdapterManager; import org.dromara.neutrinoproxy.server.base.proxy.ProxyConfig; import org.dromara.neutrinoproxy.server.base.rest.ResponseBody; import org.dromara.neutrinoproxy.server.dal.ClientConnectRecordMapper; @@ -28,19 +31,25 @@ import org.dromara.neutrinoproxy.server.service.UserLoginRecordService; import org.dromara.neutrinoproxy.server.service.UserService; import org.dromara.solonplugins.job.JobBean; import org.noear.solon.Solon; -import org.noear.solon.SolonApp; +import org.noear.solon.Utils; import org.noear.solon.annotation.Component; import org.noear.solon.aot.RuntimeNativeMetadata; import org.noear.solon.aot.RuntimeNativeRegistrar; import org.noear.solon.aot.hint.MemberCategory; import org.noear.solon.core.AppContext; +import org.noear.solon.core.util.GenericUtil; import org.noear.solon.core.util.ResourceUtil; +import org.noear.solon.core.wrap.MethodWrap; import org.noear.solon.core.wrap.ParamWrap; +import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collection; +import java.util.Map; /** + * native 打包 + * * @author songyinyin * @since 2023/10/20 11:24 */ @@ -82,21 +91,21 @@ public class NeutrinoRuntimeNativeRegistrar implements RuntimeNativeRegistrar { Collection> classes = ResourceUtil.scanClasses("org.dromara.neutrinoproxy.server.dal.entity.*"); for (Class clazz : classes) { metadata.registerReflection(clazz, MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS); + metadata.registerDefaultConstructor(clazz); + } + + for (String name : MybatisAdapterManager.getAll().keySet()) { + //用 name 找,避免出现重复的(默认的name=null) + if (Utils.isNotEmpty(name)) { + MybatisAdapter adapter = MybatisAdapterManager.getOnly(name); + if (adapter instanceof MybatisAdapterDefault) { + registerMybatisAdapter(context, metadata, (MybatisAdapterDefault) adapter); + } + } } Solon.context().methodForeach(method -> { - ParamWrap[] paramWraps = method.getParamWraps(); - for (ParamWrap paramWrap : paramWraps) { - Class paramType = paramWrap.getType(); - metadata.registerReflection(paramType, MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); - - Type genericType = paramWrap.getGenericType(); - metadata.registerReflection(genericType.getTypeName(), MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); - } - - Class returnType = method.getReturnType(); - metadata.registerReflection(returnType, MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); - + processMethod(metadata, method); }); metadata.registerReflection(ResponseBody.class, MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); @@ -111,4 +120,53 @@ public class NeutrinoRuntimeNativeRegistrar implements RuntimeNativeRegistrar { metadata.registerReflection(JobBean.class, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS); } + + /** + * 注册 mybatis 的 mapper 用到的 DO + */ + protected void registerMybatisAdapter(AppContext context, RuntimeNativeMetadata metadata, MybatisAdapterDefault bean) { + + //注册 mapper 代理 + for (Class clz : bean.getConfiguration().getMapperRegistry().getMappers()) { + metadata.registerJdkProxy(clz); + metadata.registerReflection(clz, MemberCategory.INTROSPECT_PUBLIC_METHODS); + Method[] declaredMethods = clz.getDeclaredMethods(); + for (Method method : declaredMethods) { + MethodWrap methodWrap = new MethodWrap(context, method); + processMethod(metadata, methodWrap); + } + } + } + + /** + * 注册方法,包括参数的类型、泛型和返回值类型、泛型 + */ + private void processMethod(RuntimeNativeMetadata metadata, MethodWrap method) { + ParamWrap[] paramWraps = method.getParamWraps(); + for (ParamWrap paramWrap : paramWraps) { + Class paramType = paramWrap.getType(); + if (!paramType.getName().startsWith("java.")) { + metadata.registerReflection(paramType, MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); + } + + Type genericType = paramWrap.getGenericType(); + processGenericType(metadata, genericType); + } + + Class returnType = method.getReturnType(); + if (!returnType.getName().startsWith("java.")) { + metadata.registerReflection(returnType, MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); + } + Type genericReturnType = method.getGenericReturnType(); + processGenericType(metadata, genericReturnType); + } + + private void processGenericType(RuntimeNativeMetadata metadata, Type genericType) { + Map genericInfo = GenericUtil.getGenericInfo(genericType); + for (Map.Entry entry : genericInfo.entrySet()) { + if (!entry.getValue().getTypeName().startsWith("java.")) { + metadata.registerReflection(entry.getValue().getTypeName(), MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS, MemberCategory.INVOKE_DECLARED_METHODS); + } + } + } }