diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java index 965f43d5..126ff5a9 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/aop/CrudApiAnnotationInterceptor.java @@ -23,7 +23,9 @@ import org.springframework.core.BridgeMethodResolver; import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.util.ClassUtils; import top.continew.starter.extension.crud.annotation.CrudApi; +import top.continew.starter.extension.crud.controller.BaseController; import top.continew.starter.extension.crud.handler.CrudApiHandler; +import top.continew.starter.extension.crud.handler.CrudApiStrategy; import java.lang.reflect.Method; import java.util.Objects; @@ -36,12 +38,6 @@ import java.util.Objects; */ public class CrudApiAnnotationInterceptor implements MethodInterceptor { - private final CrudApiHandler handler; - - public CrudApiAnnotationInterceptor(CrudApiHandler handler) { - this.handler = handler; - } - @Override public Object invoke(MethodInvocation invocation) throws Throwable { // 获取目标类 @@ -51,7 +47,13 @@ public class CrudApiAnnotationInterceptor implements MethodInterceptor { Method targetMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // 获取 @CrudApi 注解 CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(targetMethod, CrudApi.class); - handler.preHandle(crudApi, targetMethod, targetClass); + // 获取处理器 + CrudApiHandler crudApiHandler = CrudApiStrategy.INSTANCE.handlerMap.get(targetClass); + if (crudApiHandler != null) { + crudApiHandler.preHandle(crudApi, targetMethod, targetClass); + } else { + CrudApiStrategy.INSTANCE.handlerMap.get(BaseController.class).preHandle(crudApi, targetMethod, targetClass); + } return invocation.proceed(); } } diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java index 4987183b..8852d52e 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRequestMappingHandlerMapping.java @@ -53,7 +53,7 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi // 过滤 API,如果非本类中定义,且 API 列表中不包含,则忽略 Api[] apiArr = crudRequestMapping.api(); Api api = ExceptionUtils.exToNull(() -> Api.valueOf(method.getName().toUpperCase())); - if (method.getDeclaringClass() != handlerType && !ArrayUtil.containsAny(apiArr, Api.ALL, api)) { + if (method.getDeclaringClass() != handlerType && !ArrayUtil.contains(apiArr, api)) { return null; } // 拼接路径(合并了 @RequestMapping 的部分能力) diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRestControllerAutoConfiguration.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRestControllerAutoConfiguration.java index 32066e11..3fe4c0c1 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRestControllerAutoConfiguration.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/autoconfigure/CrudRestControllerAutoConfiguration.java @@ -19,6 +19,7 @@ package top.continew.starter.extension.crud.autoconfigure; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -27,7 +28,9 @@ import top.continew.starter.extension.crud.annotation.CrudApi; import top.continew.starter.extension.crud.aop.CrudApiAnnotationAdvisor; import top.continew.starter.extension.crud.aop.CrudApiAnnotationInterceptor; import top.continew.starter.extension.crud.handler.CrudApiHandler; -import top.continew.starter.extension.crud.handler.DefaultCrudApiHandler; +import top.continew.starter.extension.crud.handler.CrudApiStrategy; + +import java.util.List; /** * CRUD REST Controller 自动配置 @@ -41,6 +44,18 @@ public class CrudRestControllerAutoConfiguration { private static final Logger log = LoggerFactory.getLogger(CrudRestControllerAutoConfiguration.class); + /** + * 注入自定义处理器 + * + * @param handlerList 自定义处理器集合 + */ + @Autowired(required = false) + public void setCrudApiHandler(List> handlerList) { + for (CrudApiHandler handler : handlerList) { + CrudApiStrategy.INSTANCE.registerHandler(handler); + } + } + /** * CRUD API 注解通知 */ @@ -55,17 +70,8 @@ public class CrudRestControllerAutoConfiguration { */ @Bean @ConditionalOnMissingBean - public CrudApiAnnotationInterceptor crudApiAnnotationInterceptor(CrudApiHandler crudApiHandler) { - return new CrudApiAnnotationInterceptor(crudApiHandler); - } - - /** - * CRUD API 处理器(默认) - */ - @Bean - @ConditionalOnMissingBean - public CrudApiHandler crudApiHandler() { - return new DefaultCrudApiHandler(); + public CrudApiAnnotationInterceptor crudApiAnnotationInterceptor() { + return new CrudApiAnnotationInterceptor(); } @PostConstruct diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/enums/Api.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/enums/Api.java index 2960d546..98c4c146 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/enums/Api.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/enums/Api.java @@ -24,11 +24,6 @@ package top.continew.starter.extension.crud.enums; */ public enum Api { - /** - * 所有 API - */ - ALL, - /** * 分页 */ diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiHandler.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiHandler.java index 7b027bb4..99fec324 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiHandler.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiHandler.java @@ -17,6 +17,7 @@ package top.continew.starter.extension.crud.handler; import top.continew.starter.extension.crud.annotation.CrudApi; +import top.continew.starter.extension.crud.controller.BaseController; import java.lang.reflect.Method; @@ -26,7 +27,14 @@ import java.lang.reflect.Method; * @author Charles7c * @since 2.7.5 */ -public interface CrudApiHandler { +public interface CrudApiHandler { + + /** + * 获取处理器控制器类 + * + * @return 处理器控制器类 + */ + Class getHandlerControllerClass(); /** * 前置处理 diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiStrategy.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiStrategy.java new file mode 100644 index 00000000..5883533c --- /dev/null +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/CrudApiStrategy.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.continew.starter.extension.crud.handler; + +import top.continew.starter.extension.crud.controller.BaseController; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * CRUD API 策略 + * + * @author Charles7c + * @since 2.7.5 + */ +public final class CrudApiStrategy { + + /** + * 全局单例引用 + */ + public static final CrudApiStrategy INSTANCE = new CrudApiStrategy(); + + /** + * 处理器集合 + */ + public Map, CrudApiHandler> handlerMap = new LinkedHashMap<>(); + + private CrudApiStrategy() { + registerDefaultHandler(); + } + + /** + * 注册所有默认的处理器 + */ + public void registerDefaultHandler() { + handlerMap.put(BaseController.class, new DefaultCrudApiHandler()); + } + + /** + * 注册一个处理器 + * + * @param handler 处理器 + */ + public void registerHandler(CrudApiHandler handler) { + handlerMap.put(handler.getHandlerControllerClass(), handler); + } + + /** + * 移除一个注解处理器 + * + * @param controllerClass 控制器类 + */ + public void removeAnnotationHandler(Class controllerClass) { + handlerMap.remove(controllerClass); + } +} diff --git a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/DefaultCrudApiHandler.java b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/DefaultCrudApiHandler.java index 98e60d45..f3b22b9b 100644 --- a/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/DefaultCrudApiHandler.java +++ b/continew-starter-extension/continew-starter-extension-crud/continew-starter-extension-crud-core/src/main/java/top/continew/starter/extension/crud/handler/DefaultCrudApiHandler.java @@ -17,6 +17,7 @@ package top.continew.starter.extension.crud.handler; import top.continew.starter.extension.crud.annotation.CrudApi; +import top.continew.starter.extension.crud.controller.BaseController; import java.lang.reflect.Method; @@ -26,7 +27,12 @@ import java.lang.reflect.Method; * @author Charles7c * @since 2.7.5 */ -public class DefaultCrudApiHandler implements CrudApiHandler { +public class DefaultCrudApiHandler implements CrudApiHandler { + + @Override + public Class getHandlerControllerClass() { + return BaseController.class; + } @Override public void preHandle(CrudApi crudApi, Method targetMethod, Class targetClass) {