java - Jersey 2 - 请求范围绑定(bind)与单例绑定(bind)

标签 java jax-rs jersey-2.0

我正在学习 Jersey 并尝试构建一个 rest api。但是我很难理解各种绑定(bind)之间的区别 - bind()AbstractBinder()bindFactory() 以及范围 - RequestScopedSingletonPerLookup。它们之间有什么区别以及何时使用哪一个?

例如假设我有一些特定于请求的数据传递到请求 header 中。我想在请求处理期间多次使用此数据(比如在资源类、DAO 等中)。我想到的是,我将使用 request filter 并使用 ContainerRequestContext 提取数据并将其存储到某个类中。但是我无法弄清楚如何绑定(bind)此类以便以后可以访问它。在这种情况下使用哪个绑定(bind)?

最佳答案

bind()bindFactory()AbstractBinder 类中的方法,用于在注册表中绑定(bind)您的服务。 AbstractBinder 是您向 Jersey 注册的内容,以便它知道配置您的所有绑定(bind)。您使用 bind() 来绑定(bind)服务本身。您使用 bindFactory() 绑定(bind)服务,使用 Factory(或 2.26+ 中的 Supplier)来创建服务。

RequestScoped 表示服务的范围限定为请求,这意味着在请求 的生命周期内它将是同一个实例。当服务依赖于与请求相关的信息(如请求 header )时,您将使用此范围。

Singleton 范围意味着在应用程序 的生命周期内只有一个服务实例。当可以随时安全地使用服务而不受任何请求约束时,您将使用此范围。

PerLookup 意味着每次查找时都会创建一个新的服务实例,直接通过 ServiceLocator(或InjectionManager 在 2.26+ 中)或通过 @Inject(或其他注入(inject))注解。尽管这是默认范围,RequestScopeSingleton 范围更适合 Jersey 应用程序上下文中的大多数用例。

对于您想要从请求上下文中获取信息并在服务中使用它的用例,您可以使用 RequestScoped 服务并使用 bindFactory()使用 Factory(或 2.26+ 中的 Supplier)并将请求上下文注入(inject) Factory 并使用上下文创建您的服务。您可以在 How to inject an object into jersey request context? 中查看更多解释.如果您使用的是 Jersey 2.26+,您还需要阅读 Jersey 2.26: register @Inject in ResourceConfig bindFactory cannot convert Factory to Supplier

关于java - Jersey 2 - 请求范围绑定(bind)与单例绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49962686/

相关文章:

java - 应用程序与应用程序测试 : different event dispatch?

java - 是否可以在 JAX-RS/JAXB web 服务中捕获 SAXParseException?

java - IE 将 JAX-RS Web 服务的字符串响应视为文件

java - 为什么在使用 Java/Jersey 返回 404 响应时得到静态文本/html?

java - 正则表达式匹配唯一字符的字符串

java - 为什么 j.u.c.CopyOnWriteArrayList 在方法内部创建局部锁变量

java - 使用 php 在日志文件中显示消息

jersey - 在ExceptionMapper中获取原始URI

java - Swagger 是否也适用于 Jersey 2.x?

Spring Injection 在 Jersey 过滤器中不起作用 - @InjectParam 在 jersey2 中等效