【问题标题】:Conditionally expose REST resource有条件地公开 REST 资源
【发布时间】:2017-10-12 14:07:00
【问题描述】:

我正在尝试使用注释而不是部署描述符在 Java 中编写示例 REST 服务。

@ApplicationPath("/services")
public class RestApp extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> classes = new HashSet<>();
        classes.add(Request.class);
        return classes;
    }
}

一个示例请求类

@Path("sequence-numbers")
public class Request {
@POST
    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createInstance(SnsConfig snsConfig, @Context final HttpServletResponse servletResponse,
                @Context final HttpServletRequest servletRequest) {
    }
}

如果从代码中删除 classes.add(Request.class),则不应公开 @Path("sequence-numbers")。但即使我注释掉 classes.add 语句,发送请求时也会触发 post 方法。我对注释的使用是错误的还是有其他可能导致这种情况的原因?

编辑:我尝试注释掉整个 getClasses 方法,但仍然有效。我猜如果@ApplicationPath 下没有指定类,那么会扫描所有文件以查找@Path 的存在。我想使用 getClasses 的原因是检查一些特定于应用程序的条件并决定添加或不添加类/@Path。有没有办法根据条件公开 REST 资源?

【问题讨论】:

    标签: java rest


    【解决方案1】:

    是的,这是可能的。如果您在getClasses() 方法中返回一个空集,或者您没有从javax.ws.rs.core.Application 覆盖getClasses()(或getSingletons()),那么所有路径都将被扫描。如果您返回一个非空集,则只会发布指定的类。

    【讨论】:

    • 是的,我返回的是一个空集,这就是问题所在。我发布了与@ApplicationPath 对应的类,而不是返回一个空集,它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多