2017-05-15 9 views
0

私はアプリケーションに工場を注入しようとしています。このために私はジャージーの@injectクラスの方法hk2 factory in java?

工場作成しました: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; 
} 

をバインダークラスを作成します。DrawShapeBinder.java

public class DrawShapeBinder extends AbstractBinder 
{ 

@Override 
    protected void configure() 
    { 
    bind(DrawShapeFactory.class).to(DrawShapeFactory.class); 
    } 
} 

ResourceConfigのは

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

    } 

} 

Circle.java

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


} 

Tringle.java

public class Tringle extends Shape 
{ 

    public void draw() { 

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

} 

Square.java class having@Inject

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

} 

マイリソースコードは、私は次のようにエラーが発生して出力を取得しています

@SuppressWarnings({"cast"}) 
@Path("/auth") 
public class AuthResource 
{ 
    //inject here 
    @Inject DrawShapeFactory drawShapeFactory; 

    @POST 
    @Path("test") 
    public Detail test() 
    { 

     Shape shape1 = new Circle(); 
     shape1.draw(); 

     Shape shape2 = new Tringle(); 
     shape2.draw(); 

     drawShapeFactory.execute(new Tringle()); 

     Square s= new Square(); 
     s.drawTest(); 
} 

です:私はためNULLSquare.javaでクラスを取得していますなぜ

===>>> Circle draw <<<<======== 
===>>> Tringle draw <<<<======== 
===>>> Tringle draw <<<<======== 
===>>> Square draw <<<<======== 
java.lang.NullPointerException 
com.icube.rest.test.Square.drawTest(Square.java:11) 

@Inject DrawShapeFactory d rawShapeFactory; at drawShapeFactory.execute(new Circle());行?

Injectはリソースレイヤで正常に動作していますが、他のクラスではNULL exceptionを与えています。

私は間違っていますか?

おかげで

+0

'Square 'はIoCコンテナを通過しません。あなたはそれについて知るために 'Square'と例外HK2をイ​​ンスタンス化することはできません。 'Square'を必要な場所に挿入するか、' ServiceLocator'から取得する必要があります。システム内で認識されるように、バインダー内の 'Square 'もバインドする必要があります。 –

+0

@peeskillet私は、Square.javaクラスファイルにDrawShapeFactoryクラスを挿入したいだけです。これで私を助けてくれますか?あなたは私が注射についてのこのすべての詳細を得ることができるところから私に良いリンクを提供することができます。感謝 – unknownbits

+0

正直なところ、あなたのコードはとても狂っています。実際の世界の例ではより意味をなさないでしょう。私は悪い習慣を奨励したくありません。実際の事例を投稿し、本当に達成したいことを説明したい場合、私はそれを見ていきます。それ以外に、いくつかのリソースが必要な場合は、[this post](http://stackoverflow.com/a/29275727/2587435) –

答えて

0

Inject is working fine at resource layer but inside any other class it is giving me NULL exception.

:-)インジェクタとInjecteeの両方が@Inject注釈が機能するためにはHK2認識する必要があります。 Jersey Resourcesは暗黙のうちにHK2を認識しているので、あなたのファクトリをリソースにバインドすることができますが、Class SquareはHK2 Awareではありません(HK2コンテキストでは知られていません。

それ以外のDIの概念は明確ではないと言えます。 バインダー自体をバインドする代わりに、バインダーはファクトリをインスタンスにバインドし、シェイプを直接挿入する必要があります。

の場合。例えば。

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

を実装し、Shapeタイプのインスタンスを作成して返すためにprovideメソッドを実装します。

+0

のリンクを参照してください。このエラーが発生すると、MultiExceptionに3つの例外があります。それらは以下の通りです: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException:SystemInjecteeImpl(requiredType = DrawShapeFactory、parent = AuthResource、修飾子= {}、位置= -1、オプション= false、self = false、unqualified = null、1117365981) – unknownbits

+0

Downvote?真剣に?とにかく、私の解決策を試してみたら、 '@Inject'は' Shape'であり、 'DrawShapeFactory'ではありません。 FactoryをSOMEHOWに挿入したいだけなら、 'bind(DrawShapeFactory.class);' 'bind(Square.class).to(Sqaure.class);'を実行して ' AuthResourceで@Inject Square square;を実行すると、AuthResourceが呼び出されるたびにHK2にSquareインスタンスの作成と注入を依頼し、Squareクラスの@Injectが意図どおりに動作するようになります。しかし、私があなたに何をしようとしているのかをもう一度教えさせてください。 –

+0

ファクトリはサービスでもあり、それ自体で注入することもできますが、通常は行われません。 DrawShapeFactoryとShapeの両方をhk2レジストリに他のサービスにインジェクトでき​​るサービスとして配置しているbindFactory(DrawShapeFactory.class).to(Shape.class) – jwells131313

関連する問題