2017-05-15 2 views
0

J'essaye d'injecter l'usine à mon application. Pour cela, je l'ai crééComment @inject classe dans l'usine jersey hk2 en Java?

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

Créer une classe Binder: DrawShapeBinder.java

public class DrawShapeBinder extends AbstractBinder 
{ 

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

fichier ResourceConfig

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

classes ayant:

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

} 

Mon Code ressource est

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

Je reçois la sortie avec l'erreur comme:

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

Pourquoi je reçois NULL dans Square.java classe pour @Inject DrawShapeFactory d rawShapeFactory; à drawShapeFactory.execute(new Circle()); ligne?

Inject fonctionne bien à la couche de ressources, mais à l'intérieur de toute autre classe, il me donne NULL exception.

Qu'est-ce que je fais mal?

Merci :-)

+0

Le 'Square' ne passe jamais par le conteneur IoC. Vous ne pouvez pas simplement instancier 'Square' et l'exception HK2 pour le savoir. Vous devez soit injecter le "Square" là où vous en avez besoin, soit l'obtenir à partir du "ServiceLocator". Vous aurez également besoin de lier le 'Square 'dans votre classeur afin qu'il soit connu dans le système. –

+0

@peeskillet Je veux juste injecter la classe DrawShapeFactory dans le fichier de classe Square.java. Pouvez-vous m'aider s'il vous plaît dans ceci. oe vous pouvez me fournir un bon lien d'où je peux obtenir tous ces détails sur injecter. THanks – unknownbits

+0

Honnêtement, votre code me semble si fou. Cela aurait plus de sens avec un exemple du monde réel. Je ne veux pas encourager de mauvaises pratiques. Si vous voulez donner un exemple réel et expliquer ce que vous voulez vraiment accomplir, je le regarderai. Autre que cela, si vous voulez des ressources, vous pouvez consulter les liens dans [ce post] (http://stackoverflow.com/a/29275727/2587435) –

Répondre

0

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

Les deux Injector et doivent être injectée HK2 courant pour l'annotation @Inject à travailler. Les ressources de Jersey sont implicitement conscientes de HK2 et donc vous êtes capable de lier votre usine dans la ressource alors que la classe Square n'est pas HK2 Aware (Non connu dans le contexte HK2, parce que vous ne l'avez pas lié dans votre classeur). En dehors de cela, je peux dire que vos concepts DI ne sont pas clairs, Au lieu de relier l'usine elle-même, votre relieur doit lier l'usine à une instance et vous devez injecter les formes directement.

Pour. Par exemple.

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

et d'implémenter la méthode provide, pour créer et renvoyer des instances de type Shape.

+0

maintenant obtenir cette erreur: Une exception MultiException a 3 exceptions. Ils sont: 1. org.glassfish.hk2.api.UnsatisfiedDependencyException: Aucun objet n'est disponible pour injection à SystemInjecteeImpl (requiredType = DrawShapeFactory, parent = AuthResource, qualificateurs = {}, position = -1, facultatif = false, self = false, non qualifié = null, 1117365981) – unknownbits

+0

Downvote? Sérieusement? de toute façon, si vous avez essayé ma solution, alors vous auriez '@ Inject'' Shape' et pas 'DrawShapeFactory'. Si vous voulez juste injecter l'usine dans Square SOMEHOW, vous pouvez faire 'bind (DrawShapeFactory.class) .to (DrawShapeFactory.class);' 'bind (Square.class) .to (Sqaure.class);' et ensuite ' @Inject Square square; 'dans AuthResource, de sorte que chaque fois que AuthResource est invoquée, il demandera à HK2 de créer et d'Injecter une instance Square, puis @Inject dans la classe Square fonctionnera comme prévu. Mais laissez-moi vous dire à nouveau ce que vous essayez est complètement fou. –

+0

Une usine est également un service et peut être injectée comme elle-même, mais ce n'est normalement pas fait. Quand vous faites juste un bindFactory (DrawShapeFactory.class) .to (Shape.class) qui place à la fois DrawShapeFactory et Shape dans le registre hk2 comme des services qui peuvent être injectés dans d'autres services – jwells131313