gpt4 book ai didi

java - Jersey 2.26 : register @Inject in ResourceConfig bindFactory cannot convert Factory to Supplier

转载 作者:行者123 更新时间:2023-11-30 06:45:37 34 4
gpt4 key购买 nike

我现在正在使用 Jersey,我想注入(inject)一个 GeneralForm映射到 Resource 类上下文中,它接受所有 application/json , multipart/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> {
}

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<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) {
}

}

然后我将该工厂注册到我的 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方法接受 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>))

最佳答案

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;
}
}

关于java - Jersey 2.26 : register @Inject in ResourceConfig bindFactory cannot convert Factory to Supplier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48655865/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com