gpt4 book ai didi

java - Jersey ResourceConfig 不会自动发现但应用程序会自动发现吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:03:00 24 4
gpt4 key购买 nike

当我有一个非常基本的应用程序时,Jersey 会自动发现项目中的所有 REST 资源,而我不必手动注册它们:

import javax.ws.rs.ApplicationPath;
@ApplicationPath("/rest")
public class Application extends javax.ws.rs.core.Application {

}

但是当我切换到使用 Jersey 特定的 ResourceConfig 时,自动发现似乎不起作用。我必须 #registerClasses() 或添加包,如下所示:

@ApplicationPath("rest")
public class ResourceConfig extends org.glassfish.jersey.server.ResourceConfig {
public ResourceConfig() {
super();
register(RolesAllowedDynamicFeature.class);
super.packages(true, "org.example");
}
}

有没有办法让 ResourceConfig 自动发现像 Application 这样的 REST 资源,而无需单独注册类或添加应用程序的包?

最佳答案

事情是这样的:导致类路径扫描的是 Application 类,它没有注册任何东西。因此,在您的 ResourceConfig(它扩展了 Application)中,如果您没有注册 RolesAllowedDynamicFeature,您将进行类路径扫描。我的猜测是您切换到 ResourceConfig 以便您可以注册 RolesAllowedDyanamicFeature(可能来自您看到的一些示例)。这也可以通过覆盖 getClasses()Application 类中完成。但就像我说的,一旦你注册了任何东西,你就失去了类路径扫描,你需要手动注册所有东西。

一个解决方法是实现一个功能来注册您所有的类,这些类不会被类路径扫描拾取。

@Provider
public class ClassPathScanWorkAroundFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(RolesAllowedDynamicFeauture.class);
return true;
}
}

这对 ApplicationResourceConfig 类都有效。在类路径扫描期间发生的事情是,Jersey 将寻找 @Path @Provider 注释类进行注册。因此,这是一种解决方法,可以手动注册并仍然保持类路径扫描。

我要指出的是 Jersey 开发人员之一的以下文章。

基本上他们建议永远不要使用它。就我个人而言,我会坚持使用 扫描。我不认为这真的让生活变得那么困难。实际上,与使用 Feature 的替代方法相比,它的代码更少

关于java - Jersey ResourceConfig 不会自动发现但应用程序会自动发现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45700344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com