从Jersey 2.26中删除了AbstractContainerRequestValueFactory

时间:2017-11-06 18:47:07

标签: java jersey jersey-2.0

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

我的代码是:

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

    public class ClassA extends AbstractContainerRequestValueFactory<ClassB> {

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

    }

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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 将被调用以创建可以作为 @Context ClassB 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 目前支持以下范围 enter image description here