如何在java的jersey hk2工厂中@inject类?

如何在java的jersey hk2工厂中@inject类?,java,jersey-2.0,factory-pattern,inject,hk2,Java,Jersey 2.0,Factory Pattern,Inject,Hk2,我正在尝试将工厂注入到我的应用程序中。为此,我创造了 工厂:DrawShapeFactory.java public class DrawShapeFactory implements Factory<Shape> { public void execute(Shape s) { s.draw(); } @Override public void dispose(Shape shape) { // TODO Auto-generated method stub

我正在尝试将工厂注入到我的应用程序中。为此,我创造了

工厂:DrawShapeFactory.java

public class DrawShapeFactory implements Factory<Shape>
{
public void execute(Shape s)
{
    s.draw();

}

@Override
public void dispose(Shape shape) 
{
    // TODO Auto-generated method stub

}

@Override
public Shape provide() 
{
    // TODO Auto-generated method stub
    return null;
}
 public class DrawShapeBinder extends AbstractBinder
{

 @Override
  protected void configure() 
   {
     bind(DrawShapeFactory.class).to(DrawShapeFactory.class);
   }
}
资源配置文件

public class App extends ResourceConfig 
{
public App()
{
    packages("com.icube.rest.authorize","com.icube.rest.test");
    register(new DrawShapeBinder());
}
}
上课:

Shape.java

 public class Shape 
{
    public void draw()
    {

    }

}
public class Circle extends Shape
{
    public void draw() 
    {
        System.out.println("===>>> Circle draw <<<<========");
    }


}
public class Tringle extends Shape
{

    public void draw() {

        System.out.println("===>>> Tringle draw <<<<========");
    }

}
Circle.java

 public class Shape 
{
    public void draw()
    {

    }

}
public class Circle extends Shape
{
    public void draw() 
    {
        System.out.println("===>>> Circle draw <<<<========");
    }


}
public class Tringle extends Shape
{

    public void draw() {

        System.out.println("===>>> Tringle draw <<<<========");
    }

}
Square.java类具有
@inject

public class Square extends Shape
{
    @Inject DrawShapeFactory drawShapeFactory;
    public void drawTest() 
    {
        System.out.println("===>>> Square draw <<<<========");
        drawShapeFactory.execute(new Circle());
    }

}
我得到的输出错误如下:

 ===>>> Circle draw <<<<========
 ===>>> Tringle draw <<<<========
 ===>>> Tringle draw <<<<========
 ===>>> Square draw <<<<========
 java.lang.NullPointerException
 com.icube.rest.test.Square.drawTest(Square.java:11)
==>>>圆圈绘制
Inject在资源层工作正常,但在任何其他类中,它都会给我NULL异常

注入器和注入器都需要知道HK2才能使
@Inject
注释起作用。Jersey资源隐式支持HK2,因此您可以在资源中绑定工厂,而class Square不支持HK2(在HK2上下文中未知,因为您没有在绑定器中绑定工厂)

除此之外,我可以说您的DI概念不清楚, 您的绑定器应该将工厂绑定到实例,而不是绑定工厂本身,您应该直接注入形状

因为。例如

bindFactory(DrawShapeFactory.class).to(Shape.class)

并实现提供方法,以创建和返回形状类型的实例。

现在出现此错误:多重异常有3个异常。它们是:1。org.glassfish.hk2.api.UnsatifiedDependencyException:SystemInjecteeImpl(requiredType=DrawShapeFactory,parent=AuthResource,限定符={},position=-1,optional=false,self=false,unqualified=null,1117365981)下推?认真地无论如何,如果您尝试了我的解决方案,那么您将
@Inject
Shape
而不是
DrawShapeFactory
。如果您只是想以某种方式将工厂注入到Square中,您可以执行
bind(DrawShapeFactory.class).to(DrawShapeFactory.class)
绑定(Square.class).to(Sqaure.class)
然后执行
@injectsquare在AuthResource中,这样每当调用AuthResource时,它都会要求HK2创建并注入一个Square实例,然后@Inject in Square类将按照您的意愿工作。但让我再告诉你一次,你所尝试的完全是疯狂的。工厂也是一种服务,可以作为自身注入,但通常不会这样做。当您只执行bindFactory(DrawShapeFactory.class).to(Shape.class)时,即将DrawShapeFactory和hk2注册表中的形状作为可注入其他服务的服务,
Square
从不通过IoC容器。您不能只是实例化
Square
和异常HK2来了解它。您需要将
Square
插入需要它的任何位置,或者从
ServiceLocator
获取它。您还需要在活页夹中绑定
Square
,以便在系统中知道它。@peeskillet我只想在Square.java类文件中插入DrawShapeFactory类。你能在这方面帮助我吗。oe您可以为我提供一个很好的链接,从那里我可以获得有关inject的所有详细信息。谢天谢地,我觉得你的代码太疯狂了。用一个真实世界的例子会更有意义。我不想鼓励任何不良行为。如果你想发布一个真实的例子,并解释你真正想要完成的事情,我会看看。除此之外,如果您需要一些资源,可以在中查看链接