Java 泽西岛2.26+;:转换HK2';后未调用configure();从工厂到供应商
为了简化我们的web服务,我想在版本2.34中引入一个使用Jersey框架的自定义MyObj类,并希望通过@Context注释注入创建的实例 我有两个问题:Java 泽西岛2.26+;:转换HK2';后未调用configure();从工厂到供应商,java,jersey,migration,code-injection,Java,Jersey,Migration,Code Injection,为了简化我们的web服务,我想在版本2.34中引入一个使用Jersey框架的自定义MyObj类,并希望通过@Context注释注入创建的实例 我有两个问题: 假设使用web服务方法@GET test(@Context MyObj obj),我如何控制何时针对现有servlet请求过滤器的执行创建MyObj实例 为了创建MyObj的实例,我已经有了一个基于HK2工厂的工作示例(见下文)。因为我观察到我的工厂类被实例化了两次,Jersey 2.26+建议使用基于供应商的更新方法,所以我尝试转换我的
public class MyObjHK {}
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
public class BinderHK
extends AbstractBinder {
@Override protected void configure() {
bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
}
}
import org.glassfish.hk2.api.Factory;
public class MyObjFactoryHK
implements Factory<MyObjHK> {
@Override public MyObjHK provide() {return new MyObjHK();} // ok
@Override public void dispose(MyObjHK instance) {};
}
public class API_HK2 {
@GET
public static Response myobjhk(@Context MyObjHK obj) {
System.out.println("called hk, obj="+obj); // ok
return Response.ok().build();
}
}
public class MyObj {}
import org.glassfish.jersey.internal.inject.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
public class Binder
extends AbstractBinder {
@Override protected void configure() { // not called ???
bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
}
}
import java.util.function.Supplier;
public class MyObjFactory
implements Supplier<MyObj> {
@Override public MyObj get() {return new MyObj();}
}
public class API {
@GET
public static Response myobj(@Context MyObj obj) {
System.out.println("called, obj="+obj); // null ???
return Response.ok().build();
}
}
公共类MyObjHK{}
导入org.glassfish.hk2.utilities.binding.AbstractBinder;
导入org.glassfish.jersey.process.internal.RequestScoped;
公共类活页夹
扩展抽象活页夹{
@覆盖受保护的void configure(){
bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
}
}
进口org.glassfish.hk2.api.Factory;
公共级MyObjFactoryHK
机具厂{
@重写公共MyObjHK provide(){返回新的MyObjHK();}//确定
@重写公共void dispose(MyObjHK实例){};
}
公开课API_HK2{
@得到
公共静态响应myobjhk(@Context myobjhk obj){
System.out.println(“称为hk,obj=“+obj”);//确定
返回Response.ok().build();
}
}
不工作的供应商示例:
public class MyObjHK {}
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
public class BinderHK
extends AbstractBinder {
@Override protected void configure() {
bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
}
}
import org.glassfish.hk2.api.Factory;
public class MyObjFactoryHK
implements Factory<MyObjHK> {
@Override public MyObjHK provide() {return new MyObjHK();} // ok
@Override public void dispose(MyObjHK instance) {};
}
public class API_HK2 {
@GET
public static Response myobjhk(@Context MyObjHK obj) {
System.out.println("called hk, obj="+obj); // ok
return Response.ok().build();
}
}
public class MyObj {}
import org.glassfish.jersey.internal.inject.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
public class Binder
extends AbstractBinder {
@Override protected void configure() { // not called ???
bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
}
}
import java.util.function.Supplier;
public class MyObjFactory
implements Supplier<MyObj> {
@Override public MyObj get() {return new MyObj();}
}
public class API {
@GET
public static Response myobj(@Context MyObj obj) {
System.out.println("called, obj="+obj); // null ???
return Response.ok().build();
}
}
公共类MyObj{}
导入org.glassfish.jersey.internal.inject.AbstractBinder;
导入org.glassfish.jersey.process.internal.RequestScoped;
公共类活页夹
扩展抽象活页夹{
@覆盖受保护的void configure(){//未调用???
bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
}
}
导入java.util.function.Supplier;
公营工厂
执行供应商{
@重写公共MyObj get(){返回新的MyObj();}
}
公共类API{
@得到
公共静态响应myobj(@Context myobj obj){
System.out.println(“调用,obj=“+obj”);//空???
返回Response.ok().build();
}
}
活页夹不能在jersey.config..classnames
init参数中注册。您需要使用或功能注册该功能(并使用init参数注册该功能)
谢谢,但是MyFeature/Binder方法也不适用于我(我尝试使用init param jersey.config.server.provider.classnames以及jersey.config.server.provider.packages和@provider注册)。另外,与您的说法相反,BinderHK Extendes AbstractBinder的注册(参见下面我的工作示例)即使不使用功能也可以工作。欢迎提供更多提示。在第24.1章中的示例中,AbstractBinder的实现是直接注册的。它与解释相符:“虽然各个注入绑定实现各不相同,并且取决于您的用例,但要在Jersey中启用自定义注入扩展,您必须在应用程序ResourceConfig中注册自定义HK2绑定实现!”。现在,我想知道web.xml是否还不够,但我真的必须明确地使用ResourceConfig实例(我还没有测试它)?该文档已经多年没有更新了。特别是香港2号。正如您所见,它仍然使用HK2,尽管这不再是推荐的用法。除非您特别需要HK2功能,否则所有注入导入都应该来自jersey.internal.inject
包。无论是直接注册还是通过功能注册都无关紧要。我已经使用HK2和Jersey很多年了,我有点知道我在做什么。您可能需要检查配置,或者如果仍然需要帮助,请提供完整的示例。通过您所展示的(在init参数配置旁边),一切看起来都很好。好的,在设置一个完整的示例时,我显然发现了问题。我无意中用@Provider注释了AbstractBinder和要素类。在AbstractBinder类中删除注释并仅将其保留在Feature类中后(根据您的答案),问题就解决了。谢谢你的支持。我还有最后一个问题:我仍然需要保留org.glassfish.jersey.inject-jersey-hk2依赖项(在pom.xml的2.34版本中)以保持工作正常,这是正确的吗?