芋道源码 back-end 01 自定义包 | 前缀

一、 yudao-spring-boot-starter-web

1. WebProperties.java

package cn.iocoder.yudao.framework.web.config;

public class WebProperties {
    //APP 请求访问路径前缀校验
    @NotNull(message = "APP API 不能为空")
    @Valid
    private Api appApi = new Api("/app-api", "**.controller.app.**");

    //管理后台访问路径前缀校验
    @NotNull(message = "Admin API 不能为空")
    @Valid
    private Api adminApi = new Api("/admin-api", "**.controller.admin.**");
    
    //✅️自定义请求访问路径前缀校验✅️
    @NotNull(message = "Pet API 不能为空")
    @Valid
    private Api petApi = new Api("/pet", "com.pet.aid.controller.**");

}

2. YudaoWebAutoConfiguration.java

package cn.iocoder.yudao.framework.web.config;

@EnableConfigurationProperties(WebProperties.class)
public class YudaoWebAutoConfiguration {

    @Bean
    public WebMvcRegistrations webMvcRegistrations(WebProperties webProperties) {
        return new WebMvcRegistrations() {
            /**
             * 构建 prefix → 匹配条件的映射
             */
            private Map<String, Predicate<Class<?>>> buildPathPrefixes(WebProperties webProperties) {
                AntPathMatcher antPathMatcher = new AntPathMatcher(".");
                Map<String, Predicate<Class<?>>> pathPrefixes = Maps.newLinkedHashMapWithExpectedSize(2);
                //管理后台请求访问路径
                putPathPrefix(pathPrefixes, webProperties.getAdminApi(), antPathMatcher);
                //APP 请求访问路径
                putPathPrefix(pathPrefixes, webProperties.getAppApi(), antPathMatcher);
                //✅️自定义请求访问路径✅️
                putPathPrefix(pathPrefixes, webProperties.getPetApi(), antPathMatcher);
                return pathPrefixes;
            }
        };
    }

}

3. ApiRequestFilter.java

package cn.iocoder.yudao.framework.web.core.filter;
/**
 * 过滤 /admin-api、/app-api 等 API 请求的过滤器
 *
 * @author 芋道源码
 */
@RequiredArgsConstructor
public abstract class ApiRequestFilter extends OncePerRequestFilter {

    protected final WebProperties webProperties;

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) {
        // 只过滤 API 请求的地址
        String apiUri = request.getRequestURI().substring(request.getContextPath().length());
        return !StrUtil.startWithAny(apiUri, 
                //管理后台请求前缀
                webProperties.getAdminApi().getPrefix(), 
                //App应用请求前缀
                webProperties.getAppApi().getPrefix(), 
                //✅️自定义前缀✅️
                webProperties.getPetApi().getPrefix());
    }

}

二、 Mapper.java

1. YudaoMybatisAutoConfiguration.java

package cn.iocoder.yudao.framework.mybatis.config;

/**
 * MyBaits 配置类
 */
@AutoConfiguration(before = MybatisPlusAutoConfiguration.class) // 目的:先于 MyBatis Plus 自动配置,避免 @MapperScan 可能扫描不到 Mapper 打印 warn 日志

//✅️在这里加上自定义的要扫描的Mapper路径✅️
@MapperScan(value = {"${yudao.info.base-package}", "com.pet.aid"}, annotationClass = Mapper.class,
        lazyInitialization = "${mybatis.lazy-initialization:false}") // Mapper 懒加载,目前仅用于单元测试
public class YudaoMybatisAutoConfiguration {
  //......
}

2. yudao.info.base-package

每个项目的:

  1. application-unit-test.yaml ✅️
  2. application.yaml ✅️

三、打印日志

日志文件配置

logging:
  level:
    # 配置自己写的 MyBatis Mapper 打印日志
    cn.iocoder.yudao.module.demo.dal.mysql: debug
    //✅️自定义Mapper包名SQL日志路径打印✅️
    com.pet.aid.mapper: debug

四、yudao-server未开启模块404配置

package cn.iocoder.yudao.server.controller;

/**
 * 默认 Controller,解决部分 module 未开启时的 404 提示。
 * 例如说,/bpm/** 路径,工作流
 *
 * @author 芋道源码
 */
@RestController
@Slf4j
public class DefaultController {
    
    //自定义业务模块
    @RequestMapping(value = { "/admin-api/pet/**"})
    public CommonResult<Boolean> pet404() {
        return CommonResult.error(NOT_IMPLEMENTED.getCode(),
                "[IM 即时通讯 yudao-module-pet - 已禁用][参考 https://doc.iocoder.cn/im/build/ 开启]");
    }

}

五、Swagger

package cn.iocoder.yudao.framework.swagger.config;

/**
 * Swagger 自动配置类,基于 OpenAPI + Springdoc 实现。
 */
public class YudaoSwaggerAutoConfiguration {

    public static GroupedOpenApi buildGroupedOpenApi(String group, String path) {
        return GroupedOpenApi.builder()
                .group(group)
                //✅️添加自定义前缀路径✅️
                .pathsToMatch("/admin-api/" + path + "/**", "/app-api/" + path + "/**", "/pet/" + path + "/**")
                .addOperationCustomizer((operation, handlerMethod) -> operation
                        .addParametersItem(buildTenantHeaderParameter())
                        .addParametersItem(buildSecurityHeaderParameter()))
                .addOperationCustomizer(buildOperationIdCustomizer())
                .build();
    }

}

六、 yudao-server下Bean目录扫描添加自定义包名

package cn.iocoder.yudao.server;

@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package}
@SpringBootApplication(scanBasePackages = {
        //1. yudao-server服务目录
        "${yudao.info.base-package}.server",
        //2. maven子项目服务
        "${yudao.info.base-package}.module",
        //3. ✅️自定义模块自定义包名, 避免业务类无法被Spring容器管理✅️
        "com.pet.aid"},
        excludeName = {
            // RPC 相关
//            "org.springframework.cloud.openfeign.FeignAutoConfiguration",
//            "cn.iocoder.yudao.module.system.framework.rpc.config.RpcConfiguration"
        })
public class YudaoServerApplication {

}
posted @ 2026-10-19 00:19  超轶绝尘  阅读(3)  评论(0)    收藏  举报