Jersey 2.26:在ResourceConfig中注册@Inject bindFactory无法将Factory转换为Supplier
我现在正在使用Jersey,我想将一个GeneralForm
映射注入到Resource类上下文中,该上下文接受所有application/json
, multipart/form-data
和application/x-www-form-urlencoded
格式提交。
我按照Jersey文档中指定的说明操作:
https://jersey.github.io/documentation/latest/ioc.html#d0e17033
GeneralForm.java
package cn.easecloud.jrf.provider; import java.util.HashMap; public class GeneralForm extends HashMap { }
GeneralFormFactory.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 { 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) { } }
然后我将该工厂注册到我的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"); } }
但后来我失败了因为bindFactory
方法接受了Factory
类没有实现的Supplier
参数。
编译时:
方法 org.glassfish.jersey.internal.inject.AbstractBinder.bindFactory(java.lang.Class<? extends java.util.function.Supplier>,java.lang.Class)不适用(无法推断类型变量 T (实际参数列表和forms参数列表长度不同))方法 org.glassfish.jersey.internal.inject.AbstractBinder.bindFactory(java.lang.Class<? extends java.util.function.Supplier>)不适用(无法推断类型变量 T (参数不匹配; java.lang.Class无法转换为java.lang.Class<? extends java.util.function.Supplier>))方法 org.glassfish.jersey.internal.inject.AbstractBinder.bindFactory(java.util.function.Supplier)不适用(无法推断类型变量 T (参数不匹配; java.lang.Class无法转换为java.util.function.Supplier))
不同方法 org.glassfish.jersey.internal.inject.AbstractBinder.bindFactory(java.lang.Class<? extends java.util.function.Supplier>,java.lang.Class)不适用(无法推断类型变量 T (实际参数列表和forms参数列表长度不同))方法 org.glassfish.jersey.internal.inject.AbstractBinder.bindFactory(java.lang.Class<? extends java.util.function.Supplier>)不适用(无法推断类型变量 T (参数不匹配; java.lang.Class无法转换为java.lang.Class<? extends java.util.function.Supplier>))方法 org.glassfish.jersey.internal.inject.AbstractBinder.bindFactory(java.util.function.Supplier)不适用(无法推断类型变量 T (参数不匹配; java.lang.Class无法转换为java.util.function.Supplier))
泽西岛2.26对其DI支持做出了一些改变。 首先,它删除了HK2作为硬依赖,并添加了一个抽象层。 新框架使用了HK2中的一些名称,但包装却不同。 例如AbstractBinder
。 您可以在代码中看到包名中没有hk2
。 这是Jersey使用的新抽象层。
新层大量使用Java 8.例如,对于bindFactory
,它不再使用HK2 Factory
,而是使用Java 8 Supplier 。 对于bindFactory
您现在可以使工厂实现Supplier
public class GeneralFormFactory implements Supplier { private final HttpServletRequest request; @Inject public GeneralFormFactory(HttpServletRequest request) { this.request = request; } @Override public GeneralForm get() { GeneralForm result = new GeneralForm(); return result; } }