代码之家  ›  专栏  ›  技术社区  ›  Alfred Huang

Jersey 2.26:register@Inject in ResourceConfig bindFactory无法将工厂转换为供应商

  •  4
  • Alfred Huang  · 技术社区  · 6 年前

    我现在正在使用球衣,我想注射 GeneralForm 映射到资源类上下文,该上下文接受所有 application/json , multipart/form-data application/x-www-form-urlencoded 格式提交。

    我遵守泽西岛文件规定的指示:

    https://jersey.github.io/documentation/latest/ioc.html#d0e17033

    一般形式。Java语言

    package cn.easecloud.jrf.provider;
    import java.util.HashMap;
    
    public class GeneralForm extends HashMap<String, Object> {
    }
    

    通用工厂。Java语言

    package cn.easecloud.jrf.provider;
    
    import org.glassfish.hk2.api.Factory;
    import javax.inject.Inject;
    import javax.servlet.http.HttpServletRequest;
    
    public class GeneralFormFactory implements Factory<GeneralForm> {
    
        private final HttpServletRequest request;
    
        @Inject
        public GeneralFormFactory(HttpServletRequest request) {
            this.request = request;
        }
    
        @Override
        public GeneralForm provide() {
            GeneralForm result = new GeneralForm();
            return result;
        }
    
        @Override
        public void dispose(GeneralForm t) {
        }
    
    }
    

    然后我将工厂注册到我的资源配置中:

    package cn.cwhale.bowei;
    
    import cn.easecloud.jrf.provider.AuthenticationFilter;
    import cn.easecloud.jrf.provider.GeneralForm;
    import cn.easecloud.jrf.provider.GeneralFormFactory;
    import org.glassfish.jersey.internal.inject.AbstractBinder;
    import org.glassfish.jersey.media.multipart.MultiPartFeature;
    import org.glassfish.jersey.process.internal.RequestScoped;
    import org.glassfish.jersey.server.ResourceConfig;
    import org.glassfish.jersey.server.spring.SpringLifecycleListener;
    import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
    import org.springframework.web.filter.CommonsRequestLoggingFilter;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.container.ContainerRequestFilter;
    
    @ApplicationPath("/api/*")
    public class AppConfig extends ResourceConfig {
    
        public AppConfig() {
    
            packages("cn.cwhale.bowei");
    
            register(MultiPartFeature.class);
            register(SpringLifecycleListener.class);
            register(RequestContextFilter.class);
            register(ContainerRequestFilter.class);
            register(CommonsRequestLoggingFilter.class);
            register(AuthenticationFilter.class);
    
            register(new AbstractBinder() {
                @Override
                protected void configure() {
                    bindFactory(GeneralFormFactory.class).to(GeneralForm.class)
                    .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
                }
            });
    
            property("encoding", "utf-8");
    
        }
    
    }
    

    但后来我失败了,因为 bindFactory 方法接受 Supplier<T> 参数 Factory 类未实现。

    enter image description here

    编译时:

    方法 org.glassfish.jersey.internal.inject.AbstractBinder.<T>bindFactory(java.lang.Class<? extends java.util.function.Supplier<T>>,java.lang.Class<? extends java.lang.annotation.Annotation>)不适用
      (无法推断类型变量 T
        (实际参数列表和形式参数列表长度不同))
    方法 org.glassfish.jersey.internal.inject.AbstractBinder.<T>bindFactory(java.lang.Class<? extends java.util.function.Supplier<T>>)不适用
      (无法推断类型变量 T
        (参数不匹配; java.lang.Class<cn.easecloud.jrf.provider.GeneralFormFactory>无法转换为java.lang.Class<? extends java.util.function.Supplier<T>>))
    方法 org.glassfish.jersey.internal.inject.AbstractBinder.<T>bindFactory(java.util.function.Supplier<T>)不适用
      (无法推断类型变量 T
        (参数不匹配; java.lang.Class<cn.easecloud.jrf.provider.GeneralFormFactory>无法转换为java.util.function.Supplier<T>))
    
    1 回复  |  直到 6 年前
        1
  •  8
  •   Paul Samsotha    6 年前

    Jersey 2.26对其DI支持进行了一些更改。首先,它删除了HK2作为硬依赖项,并添加了一个抽象层。新框架使用了HK2的一些名称,但包装有所不同。例如 AbstractBinder . 您可以在代码中看到 hk2 在包名称中。这是Jersey使用的新抽象层。

    新层大量使用Java 8。例如 bindFactory ,它不再使用HK2 Factory ,但使用Java 8 Supplier . 用于 bindFactory公司 现在,您将使工厂实现 Supplier

    public class GeneralFormFactory implements Supplier<GeneralForm> {
    
        private final HttpServletRequest request;
    
        @Inject
        public GeneralFormFactory(HttpServletRequest request) {
            this.request = request;
        }
    
        @Override
        public GeneralForm get() {
            GeneralForm result = new GeneralForm();
            return result;
        }
    }