Jersey 2.26:在 ResourceConfig bindFactory 中注册 @Inject 无法将工厂转换为供应商

Alf*_*ang 4 java forms rest json jersey-2.0

现在我使用的球衣,我想注入GeneralForm映射到资源类方面,它接受所有application/jsonmultipart/form-dataapplication/x-www-form-urlencoded格式的提交。

我按照 Jersey 文档中指定的说明进行操作:

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> {
}
Run Code Online (Sandbox Code Playgroud)

通用表单工厂.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) {
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我将该工厂注册到我的 ResouceConfig 中:

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");

    }

}
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

编译时:

?? 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>))
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 8

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那是正确的(最新的)文档,他们只是还没有来得及更新它。 (2认同)