2017-05-15 1 views
0

Ich versuche, Fabrik zu meiner Anwendung zu injizieren. Dafür habe ichWie @ Klasse in Jersey hk2 Fabrik in Java injizieren?

erstellt

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

erstellen Binder Klasse: 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()); 
} 
} 
Datei

Mit Klassen:

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

} 

Mein Ressourcen Code ist

@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(); 
} 

I-Ausgang wie bei Störung erhalte:

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

Warum ich NULL in Square.java Klasse für bin immer @Inject DrawShapeFactory d rawShapeFactory; bei drawShapeFactory.execute(new Circle()); Linie?

Inject funktioniert gut in der Ressourcenschicht, aber innerhalb jeder anderen Klasse gibt es mir NULL exception.

Was mache ich falsch?

Danke :-)

+0

Der 'Square' geht niemals durch den IoC-Container. Sie können nicht einfach "Square" und Ausnahme HK2 instanziieren, um darüber zu wissen. Sie müssen entweder den "Square" in den gewünschten Ort injizieren oder ihn vom "ServiceLocator" holen. Sie müssen auch den "Square" in Ihrem Ordner binden, damit er im System bekannt ist. –

+0

@peeskillet Ich möchte nur DrawShapeFactory-Klasse in Square.java-Klassendatei injizieren. Kannst du mir bitte dabei helfen? oe Sie können mir einen guten Link von wo ich all diese Details über inject bekommen kann. Danke – unknownbits

+0

Ehrlich, dein Code sieht so verrückt nach mir aus. Es würde mehr Sinn machen mit einem realen Beispiel. Ich möchte keine schlechten Praktiken fördern. Wenn Sie ein echtes Beispiel veröffentlichen und erklären möchten, was Sie wirklich erreichen wollen, werde ich es mir ansehen. Anders als das, wenn Sie einige Ressourcen möchten, können Sie die Links in [diesem Beitrag] (http://stackoverflow.com/a/29275727/2587435) –

Antwort

0

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

Beide Injector und Injectee müssen HK2 bewusst sein, für die @Inject Anmerkung zu arbeiten. Jersey Resources sind implizit HK2-fähig und daher können Sie Ihre Factory in Ressource binden, während die Klasse Square nicht HK2 Aware ist (in HK2 Context nicht bekannt, da Sie sie nicht in Ihre Binder gebunden haben).

Abgesehen davon kann ich sagen, dass Ihre DI-Konzepte nicht klar sind, Anstelle der Bindung der Fabrik selbst sollte Ihr Binder die Fabrik an eine Instanz binden und Sie sollten die Formen direkt injizieren.

Für. Z.B.

und implementieren Sie die Bereitstellungsmethode zum Erstellen und Zurückgeben von Instanzen des Formtyps.

+0

jetzt erhalten diesen Fehler: Eine MultiException hat 3 Ausnahmen. Sie sind: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: Es gab kein Objekt für die Injektion bei SystemInjecteeImpl (erforderlichType = DrawShapeFactory, parent = AuthResource, Qualifikationsmerkmale = {}, Position = -1, optional = false, self = falsch, unqualifiziert = null, 1117365981) – unknownbits

+0

Downvote? Ernst? Wie auch immer, wenn du meine Lösung ausprobierst, würdest du "Shape" und NICHT "DrawShapeFactory" 'injizieren. Wenn Sie Factory nur in Square SOMEHOW injizieren wollen, können Sie 'bind (DrawShapeFactory.class) .to (DrawShapeFactory.class);' 'bind (Square.class) .to (Sqaure.class);' und dann tun ' @Inject Square square; 'in AuthResource, so dass, wenn AuthResource aufgerufen wird, HK2 aufgefordert wird, eine Square-Instanz zu erstellen und zu injizieren, und dann @Inject in Square-Klasse funktioniert so, wie Sie es beabsichtigen. Aber lassen Sie mich Ihnen noch einmal sagen, was Sie versuchen, ist total verrückt. –

+0

Eine Fabrik ist auch ein Service und kann als selbst injiziert werden, aber es ist normalerweise nicht getan. Wenn Sie nur eine bindFactory (DrawShapeFactory.class) .to (Shape.class) ausführen, die sowohl DrawShapeFactory als auch Shape in der hk2-Registrierung als Dienste platziert, die in andere Dienste eingefügt werden können – jwells131313

Verwandte Themen