#jersey #hk2
Вопрос:
Сейчас я использую Джерси и хочу вставить GeneralForm
карту в контекст класса ресурсов, который принимает все application/json
multipart/form-data
и application/x-www-form-urlencoded
форматирует отправку.
Я следую инструкциям, указанным в документации по Джерси:
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<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 resu<
}
@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
класс не реализовал.
И когда компилировать:
方法 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:
Джерси 2.26 внес некоторые изменения в свою поддержку DI. Сначала он удалил HK2 как жесткую зависимость и добавил уровень абстракции. В новой структуре используются некоторые имена из HK2, но упаковка отличается. Например, в AbstractBinder
. Вы можете видеть в своем коде, что hk2
в имени пакета его нет. Это новый уровень абстракции, который использует Джерси.
Новый слой широко использует Java 8. Например , в случае с bindFactory
, он больше не использует HK2 Factory
, а вместо этого использует поставщика Java 8. Для 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 resu<
}
}
Комментарии:
1. Большое вам спасибо, и где я могу найти правильную документацию?
2. Это правильная (самая последняя) документация, они просто не удосужились ее обновить.