【问题标题】:AbstractContainerRequestValueFactory removed from Jersey 2.26AbstractContainerRequestValueFactory 从 Jersey 2.26 中删除
【发布时间】:2017-11-06 18:47:07
【问题描述】:

我将项目中的 Jersey 升级到 2.26 版本。

我的代码是:

    import org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory;

    public class ClassA extends AbstractContainerRequestValueFactory<ClassB> {

            @Override
            public ClassB provide() {
                    .....
            }

    }

AbstractContainerRequestValueFactory 类已被删除,我没有找到解决方法。

【问题讨论】:

  • 这在 GitHub 上很容易找到:github.com/jersey/jersey/issues/3630 本质上:不要使用 internal.* 包中的类。
  • 我看到了这个页面,但我不知道我必须使用哪个类。我可以用什么来代替AbstractContainerRequestValueFactory
  • @JuanPommerenck 有关此问题的任何更新?,我有同样的问题

标签: java jersey jersey-2.0


【解决方案1】:

来自https://github.com/jersey/jersey/commit/1f4614787c4cfddb5d9177c6c2a663b96ab673cc#diff-bcd9d3f0cfac8ea5e8e9a6b00119237b 提交我们可以看到我们应该使用下面的代码。

private static final class BeanParamValueProvider implements Function<ContainerRequest, Object> {

【讨论】:

  • 任何人都可以将此答案应用于问题中提供的代码。这似乎没有解决问题提到的 AbstractContainerRequestValueFactory ...
【解决方案2】:

或者,我们可以使用自定义 HK2 绑定,它们被配置为 Jersey 应用程序的一部分。在classpath中添加jersey-hk2依赖依赖org.glassfish.jersey.inject:jersey-hk2

定义 Factory 类以根据资源范围生成实例

import org.glassfish.hk2.api.Factory;
import javax.ws.rs.ext.Provider;
@Provider
public class ClassA implements Factory<ClassB> {
    @Override
    public ClassB provide() {
        // construct ClassB instance based on your requirement 
        //here I am simply returning the object
        return new ClassB();
    }
    @Override
    public void dispose(ClassB instance) {/**Noop**/}
}

注册自定义工厂类

例如,我必须为每个请求注入 ClassB 实例,然后我可以将上述工厂注册到 RequestScoped 的范围内,在这种情况下,每个请求都会调用 ClassA#provide 来创建 ClassB 实例的值可以检索为@Context ClassB classB

import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ext.Provider;
@Provider
class ApplicationConfig extends ResourceConfig {
    public ApplicationConfig() {
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bindFactory(ClassA.class)
                        .to(ClassB.class)
                        .in(RequestScoped.class);
            }
        });
    }
}

Jersey 当前支持以下范围

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多