Spring-Boot Starter 中如何根据配置的路径生成对应的 HTTP 请求处理器?

发布于 2022-09-13 00:45:18 字数 1308 浏览 21 评论 0

自己制作的 Spring-Boot Starter,如何实现 当使用方集成了这个 Starter(假定使用方应用存在 Web 环境),根据使用方法在其应用的 properties 文件设置的路径,在其应用中生成一个对应路径的 HTTP 请求处理器。比如希望使用方集成了这个 Starter 后,他的应用就具备了类似于如下 Controller 的功能:

@RestController
public class NoticeController {

    @GetMapping("/notice")
    public Map<String, Object> notice(@RequestParam String groupId,
                                      @RequestParam String dataId) {
        logger.info("get notice, groupId={}, dataId={}", groupId, dataId);

        JSONObject notice = new JSONObject(4);

        notice.put("groupId", groupId);
        notice.put("dataId", dataId);

        // 根据 groupId 和 dataId 去查询数据
        String detail = getDetailData(groupId, dataId);
        notice.put("detail", detail);

        return notice;
    }

    private String getDetailData(String groupId, String dataId) {
        return "Hello World!";
    }
}

然后假定使用方的应用的域名是 localhost,那么访问 localhost/notice?groupId=testGroup&dataId=testData

请求示例

其中,"/notice" 这个路径是个示例,这个路径希望是支持自定义的(比如在 application.properties 文件里面,使用方设置属性 notice.path=somePath

所以最终请教大家的问题:在 Spring-Boot Starter 中,如何根据用户指定的路径,生成对应的 HTTP 请求处理器?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾城泪 2022-09-20 00:45:18

自动配置+扫描你的controller包,不就搞定了

冷︶言冷语的世界 2022-09-20 00:45:18

既然已经做 starter 了
那就直接在 @Configuration 的类里 @Bean 一个这个 Controller 就可以了

魂ガ小子 2022-09-20 00:45:18

已经找到解法。@GetMapping (以及其他 @RequestMapping 功能的注解),在指定映射路径时,支持使用 EL 表达式 —— 所以解法为指定映射路径时使用 EL 表达式从 properties 文件取值。对于我需要的功能(在 Spring-Boot Starter 中,如何根据用户指定的路径,生成对应的 HTTP 请求处理器),实现流程如下:

首先修改上面的 Controller:

@RestController
public class NoticeController {

    @GetMapping("{notice.path}")
    public Map<String, Object> notice(@RequestParam String groupId,
                                      @RequestParam String dataId) {

        ...
    }
}

其中 GetMapping 中的映射路径换成了 EL 表达式 {notice.path},即从 properties 文件中取 notice.path 对应的值。然后就是大家都熟悉的流程,定义 ConfigurationProperties

@ConfigurationProperties("notice")
public class NoticeProperties {

    private String path;

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }
}

定义 Configuration

@Configuration
@Import(NoticeController.class)
@ConditionalOnWebApplication
@ConditionalOnProperty(prefix = "notice", name = "path")
@EnableConfigurationProperties(NoticeProperties.class)
public class NoticeAutoConfiguration {}

NoticeAutoConfiguration 只有当前应用有 Web 环境 且配置了 notice.path 时才会生效;通过 @Import 为来当前应用引入 NoticeController 这个组件(当然也可以使用 @Bean 来注册)。

最后在 META-INF/spring.factories 文件中对 NoticeAutoConfiguration 声明自动配置即可:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.xxx.notice.NoticeAutoConfiguration
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文