2016-04-19 10 views
0

Ich habe zwei Felder in meiner Klasse:CDI @Dependent und @New

public class Class { 

    @Inject private ClassA a; 
    @Inject private ClassB b; 

    public void search(String lqlSentence) 
    { 
     this.a.something(); 
     AnotherClass anotherOne = new AnotherOne; 
     anotherOne.method(this.b); 
    } 
} 

CDI sagt mir:

Unbefriedigend Abhängigkeiten für Typ KlasseA mit Qualifier @Default

CDI sagt mir jedoch nichts über ClassB b Feld.

Dann habe ich hinzugefügt, um eine @Dependent Anmerkung:

@Inject @Dependent private ClassA a; 

CDI sagt mir das gleiche.

Allerdings, wenn ich dieses Feld mit einem @New CDI annotieren funktioniert.

Warum, wenn ich @New benutze funktioniert? Warum CDI sagt mir nichts über die andere Eigenschaft Class B?

Antwort

1

Diese Qualifizierungsannotation (@Dependent) geht an die Klassendefinition selbst oder den Erzeuger für die Bean. Nicht am Injektionspunkt.

Verwenden Sie auch nicht @New. es ist veraltet. Es funktioniert genauso wie abhängig, wird aber von der Seite des Injektionspunkts aus gesteuert, während CDI auf der Herstellerseite liegt.

+0

Ich habe es. Vielen Dank. – Jordi

+0

Ich finde immer noch nicht heraus, warum CDI warnt mich über '@Inject private ClassA a;' und es sagt mir nichts über das zweite Feld '@Inject private ClassB b;' ... – Jordi

+0

Was meinst du mit "warnen"? Nachrichten protokollieren?Können Sie die Definitionen von jedem teilen? –

0

CDI in Java EE arbeitet mit "Typen". Wenn Sie also eine Schnittstelle haben, die von verschiedenen Klassen implementiert wird und Sie versuchen, diese Schnittstelle zu injizieren, dann wird sich CDI über die Typ-Ambiguität beschweren, da es den Typ der zu injizierenden Bean-Instanz nicht auflösen kann. Für Ex: Können sagen wir so etwas wie dieses:

public interface UserDao{ 
    // methods...... 
} 

public class UserDaoMongoImpl implements UserDao{ 
    //Mongo db implementations.... 
} 

public class UserDaoOrclImpl implements UserDao{ 
    // oracle Db specific implementations for userDao 
} 

@Stateless 
public class UserServiceImpl implements UserService{ 

    @Inject private UserDao userDao; //injectPoint 

    //service impl ... 

} 

hier Dann CDI nicht Coz nun die Implementierung der Lage sein, zu bestimmen, zu injizieren, haben wir drei verschiedene Arten von UserDao

  1. UserDao ist a UserDao
  2. UserDaoMongoImpl ist ein UserDao
  3. UserDaoOrclImpl a UserDao ist

verursacht alle Arten von Verwirrung für CDI.

Jetzt, um dies zu überwinden, haben wir Qualifier, die einfache Anmerkungen sind.

So ist der obige Code wird so etwas wie:

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD,ElementType.TYPE}) 
public @interface MongoImplementation { 
} 

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.FIELD,ElementType.TYPE}) 
public @interface OrclImplementation { 
} 


public interface UserDao{ 
    // methods...... 
} 

@MongoImplementation 
public class UserDaoMongoImpl implements UserDao{ 
    //Mongo db implementations.... 
} 

@OrclImplementation 
public class UserDaoOrclImpl implements UserDao{ 
    // oracle Db specific implementations for userDao 
} 

@Stateless 
public class UserServiceImpl implements UserService{ 

    @Inject @MongoImplementation  //Injection point A 
    private UserDao mongoUserDao; 

    @Inject @OrclImplementation  //Injection point B 
    private UserDao orclUserDao; 

    //service impl ... 

} 

So diese CDI jetzt mit immer wissen, welcher Implementierung oder welcher Art an der Injektionsstelle zu injizieren, und dies wird nicht über die Ambiguität beschweren.