java - 自动向 Jersey 客户端注册 ClientResponseFilter 和其他提供程序

标签 java rest jakarta-ee jax-rs

是否有任何方法可以在不使用 WebTargetClient 上的 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/

相关文章:

java - 为什么不应该将所有函数参数都声明为 final?

ruby-on-rails - 向 Grape 实体添加常量属性

java - @RequestParam 和可选的 Spring REST

java - Java EE 服务器上的动态角色

Java正则表达式-多行

java - 如何在 JUnit 中捕获异常

java - 当我可以 ping 通 IP 地址时,为什么 InetAddress.isReachable 返回 false?

javascript - XMLHttpRequest - 来自 JavaScript 的 REST

java - 如何将 vue dist 文件夹部署到 GlassFish 5?

java - 从 hibernate 中多对多关系的表中访问数据