是否有任何方法可以在不使用 WebTarget
或 Client
上的 register()
方法的情况下自动注册 ClientResponseFilter
>?
我正在寻找类似于 @Provider
注释的东西,它只能在 ContainerResponseFilter
/ContainerRequestFilter
中使用。
最佳答案
不幸的是,客户端没有实现扫描功能。最接近自动注册的方法是使用 SPIs (Service Provider Interfaces) 。任何支持的 SPI 将特定于 JAX-RS 实现。在 this post ,您可以看到如何将 MessageBodyReader
实现为 SPI,并且 JAX-RS 实现可能自动注册它。
正如前面提到的,由 JAX-RS 实现来决定它想要支持哪些 SPI。对于 Jersey,最通用的 SPI 是 AutoDisoverable
.
public interface AutoDiscoverable {
public void configure(FeatureContext context);
}
您只需实现此接口(interface),并使用 FeatureContext
注册您想要的任何提供程序。然后创建一个文件
/META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable
然后将实现的完全限定名称放入该文件中。 Jersey 运行时将发现此文件并调用您的 configure()
方法。
AutoDiscoverable
的一个示例是 JacksonAutoDiscoverable
。和the SPI file 。当我们添加 jersey-media-json-jackson
依赖于我们的项目,Jersey 将找到 AutoDiscoverable
的 SPI 实现,并调用 configure()
方法,该方法注册 JacksonFeature
,因此我们不需要自己手动注册。
自动发现或大多数 SPI 通常是与可重用库一起使用。通常,对于您的提供程序仅用于该特定项目的项目,向提供程序添加自动发现功能只会增加不必要的工作。手动注册提供商会更容易。但是,如果您想创建一个可以重用的库,并且希望用户不必显式注册任何提供程序或功能,那么您可能需要实现自动发现。
<小时/>更多详细信息
如果您要实现AutoDiscoverable
,我应该提到的一件事是我们可以对其应用到哪个运行时施加约束;客户端或服务器,我们使用 @ConstrainedTo
注释来实现。
@ConstrainedTo(RuntimeType.CLIENT)
public class MyAutoDiscoverable implements AutoDiscoverable {}
如果您的 AutoDiscoverable
注册了 ClientRequestFilter
,那么您不希望服务器注册它,因此您会限制客户端运行时。
关于java - 自动向 Jersey 客户端注册 ClientResponseFilter 和其他提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770066/