2016-06-01 10 views
-1

Ich heruntergeladen intelliJ, die mir einen Rat gibt, meine Injektionen in einen Konstruktor zu setzen. Aber wenn ich tue, was sie raten, habe ich eine andere Nachricht, dass ich einen leeren Konstruktor brauche. Also frage ich mich, was ist der beste Weg, um etwas zu implementieren:Cdi Konstruktor Injektion ejb

Das ist nur eine Hintergrundaufgabe in einer JSF-Anwendung, die jede Minute ausgeführt werden.

@Singleton 
public class MatchesBgService implements Serializable { 
    @Inject //intelliJmessage : Hey, you should use constructor injection 
    private MatchLookup ml; 
    @Inject 
    private MatchTask bgTask; 

    public MatchesBgService(){ 
     comparator = new MatchComparator(); 
    } 

    @Schedule(hour = "*", minute = "*/1", second = "20", persistent = false) 
    public void gettingMatches() { 
+0

@BalusC es war falsch Import, keine architektonische Frage. – Ced

+0

@BalusC die Informationen zur Verfügung gestellt, dass es keine architektonische Frage war – Ced

Antwort

1

Code könnte wie folgt aussehen:

@Singleton 
public class MatchesBgService implements Serializable { 

    private final MatchLookup ml; 
    private final MatchTask bgTask; 

    @Inject 
    public MatchesBgService(MatchLookup ml, MatchTask bgTask){ 
     this.ml = ml; 
     this.bgTask = bgTask; 

     // ... 
    } 
} 

Ihre Zweifel beantworten:

  1. Es ist eine gute Praxis als eine Konstruktor Injektion zu verwenden, wo immer es Sinn macht.
  2. CDI-Spezifikation besagt, dass Sie einen leeren Standardkonstruktor benötigen (um die Klasse proxyfähig zu haben).
    Aber zum Glück, zumindest Weld erfordert es nicht - so funktioniert meine obige Code funktioniert ganz gut.

Aus diesem Grund gibt Ihnen IntelliJ diese Ratschläge.
Prost

+0

Hatte den Import von Singleton zu ändern, um nicht die Oine in EJB zu sein – Ced

+0

Yup. Das ist richtig. –