【问题标题】:JerseyConfig and @Profile to hide a REST endpointJerseyConfig 和 @Profile 隐藏 REST 端点
【发布时间】:2018-04-06 20:40:27
【问题描述】:

我正在尝试根据 Spring 和 Jersey 中的运行时配置隐藏 REST 端点。最直接的方法是从控制器本身抛出NotFoundException,但也许有更多的犹太洁食。控制器在扩展org.glassfish.jersey.server.ResourceConfig的配置类的构造函数中注册。

我想过在控制器上使用@Profile 注释,但我仍然可以访问端点。当我到达那个端点时,我收到以下错误:

o.g.j.s.s.SpringComponentProvider - None or multiple beans found in Spring context

但随后 Jersey 设法访问该控制器,我通过将调试器附加到 Spring 进程来确认这一点。所以 Jersey 不支持 @Profile 设置。

另外,我还将 Swagger 插入 Jersey,当访问定义端点 (.../swagger.json) 时,我可以看到 @Profile-disabled 控制器提供的端点。

我可以在这里做的更好的事情就是抛出NotFoundException 是最好的选择吗?

【问题讨论】:

    标签: spring rest jersey-2.0 swagger-2.0


    【解决方案1】:

    注意:抱歉,我以为我看到您使用的是 Spring Boot。以下答案仅与 Spring Boot 有关。


    @Profile 仅适用于 Spring bean 注册,但您仍在将服务注册到 Jersey 作为资源。您可以做的是使用ResourceConfigCustomizer 并将@Profile 添加到定制器中。这样,如果正确的配置文件处于活动状态,它只会向 Jersey ResourceConfig 注册资源。

    @Component
    @Profile("..")
    public class MyResourceConfigCustomizer implements ResourceConfigCustomizer {
        @Override
        public void customize(ResourceConfig config) {
            config.register(MyResource.class);
        }
    }
    

    【讨论】:

    • 完美!解决了我的用例!谢谢!
    • 你在使用 Spring Boot 吗?
    • 是的,很抱歉我没有更具体。
    • 请注意,如果您的 Jersey 资源类也是一个 Spring 组件(这不是必需的),那么您仍然应该将 @Profile 也添加到该类中,因为即使该资源不会被注册使用 Jersey 时,配置文件将不处于活动状态,您仍然会无缘无故地放置 Spring bean。
    • 谢谢。我将@Profile 应用于定制器和控制器。我想确保即使没有球衣也不会意外过期
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多