No EJB found with interface of type

internet

Top Contributor
Hallo,

ich habe mehrere Eclipse Projekte.
Eines der Eclipse Projekte dient mir als ein Projekt, das ich in den anderen Projekte nutze (in folgendem ShareProject)
Hier sind dann Klassen, die ich immer wieder verwende - so muss ich nicht in jedem einzelnen Projekt diese Klassen implementieren.

Ebenfalls habe ich einige EJB Klassen.
Nun möchte ich in dem ShareProject Interfaces bereitstellen, die dann das jeweilige Projekt entsprechend implementiert.
Das funktioniert ja alles auch so weit ganz gut.
Nun habe ich aber Projekte, die das Interface NICHT implementieren sollen.
Nun bekomme ich aber dann das Problem mit dieser Exception:

No EJB found with interface of type

Interface in ShareProject:
Java:
public interface EmailAddressPlaceholderService {

    /**
     * Ersetzt alles
     */
    public String replace(String inputText, String languageCode, ObjectForReplacementObject object);
    

    /**
     * Create Menu for primefaces menu
     *
     * @param editorName
     * @return
     */
    public DefaultSubMenu createPrimefacesMenu(String editorName, String languageCode);

    /**
     * Gibt eine Liste der möglichen Platzhalter zurück
     *
     * @return
     */
    public List<ObjectListHelper> findAllEmailPlaceholder(String languageCode);
}


Dann im jeweiligen Projekt:
Code:
@Stateless
public class EmailAddressPlaceholderServiceGeneralBean {

    public String replace(String inputText, String languageCode, ObjectForReplacementObject object) {
        ....
    }
}

Hat jemand eine Idee, wie ich das verhinden kann, wenn ich das Interface nicht in dem jeweiligen Projekt implementiere, dass diese Meldung nicht kommt...
 
Die Fehlermeldung kommt nicht davon, dass du das Interface nicht implementierst. Die Fehlermeldung kommt daher, dass du das Interface verwendest ohne eine Implementierung zu haben.

Wenn in einem Projekt das Interface nicht implementiert wird (und auch keine andere Implementierung bereitgestellt wird), dann darf es auch keine Bean geben, die das per @Inject nutzt. Ansonsten kann das natürlich nicht funktionieren. Das heißt, du müsstest mal nach den Verwendungen des Interfaces in beiden Projekten schauen.
 
Ok, danke....
Meine Idee war es, dass ich im ShareProject dennoch das verwende - auch wenn ich keine Implementierung dafür habe.
Denn nicht in jedem Projekt benötige ich dies bpsw.

Also, dass ich ein Inject im SharedProject zwar mache, aber das bspw. übersprungen wird, wenn es dafür kein Interfaces findet.
Java:
@EJB
private EmailAddressPlaceholderService emailAddressPlaceholderService

Vllt. gibt es noch eine andere Idee?
Ansonsten muss ich eben das Interface in den jeweiligen anderen Projekten mit einer Implementierung haben, ob benötigt oder nicht.
 
Also erstmal ist das schon vom Grundsatz her leicht fraglich. In einem Projekt ein Interface nutzen, für das im fertigen Programm keine Implementierung gibt ist schon mal vom Stil her fraglich.

Grundsätzlich könnte sowas gehen - aber da weiß ich nicht wie JEE an der Stelle tickt - wenn die Klasse, wo das inject ist wiederum selber im fertigen Programm nie auftaucht. Sprich, die Klasse, wo dein obiges Inject ist, darf dann im gesamten Programm selber auch nie injected werden usw. Aber ich weiß da nicht im Detail, wie JEE da tickt und wann der Lookup erfolgt.
 
Wenn du drauf zugreifst mit myInterface.get muss es existieren. Ansonsten ist deine Anwendung ziemlicher Murks 🙂

Ok, also sowas:
Java:
@EJB
private Instance<EmailAddressPlaceholderService> emailAddressPlaceholderService;

Dann hier prüfen:

Code:
    public List<ObjectListHelper> findAllPlaceholder() {

        if (emailAddressPlaceholderService.get() != null) {
            List<ObjectListHelper> emailList = emailAddressPlaceholderService
                    .findAllEmailPlaceholder();
        }

        return emailList;
    }

Bekomme aber nun diese Fehlermeldung:
1676014179068.png
 
Du bekommst die Bean aus get raus und musst deine Methode dann auf der Rückgabe aufrufen.

Aber wie gesagt, überhaupt auf etwas zuzugreifen, wovon es keine konkrete Instanz gibt ist gelinde gesagt extrem fragwürdig vom Stil her.
 
Du bekommst die Bean aus get raus und musst deine Methode dann auf der Rückgabe aufrufen.

Aber wie gesagt, überhaupt auf etwas zuzugreifen, wovon es keine konkrete Instanz gibt ist gelinde gesagt extrem fragwürdig vom Stil her.

Ok, also der Compiler - Fehler ist weg, aber leider funktioniert das immer noch nicht. Oder mache ich etwas falsch?

Java:
    @EJB
    private Instance<EmailAddressPlaceholderService> emailAddressPlaceholderService;

Code:
    public List<ObjectListHelper> findAllPlaceholder() {
        
        EmailAddressPlaceholderService emailAddressPlaceholderServiceBean = emailAddressPlaceholderService.get();

        List<ObjectListHelper> emailList = emailAddressPlaceholderServiceBean
                .findAllEmailPlaceholder("de");

        return emailList;
    }


No Jakarta Enterprise Beans found with interface of type 'javax.enterprise.inject.Instance' for binding PlaceholderEmailAddressMenuNotLazyController/emailAddressPlaceholderService"},
 
Annstelle von @EJB würde ich @Inject nehmen.

Keine Ahnung ob Instance auch mit @EJB geht.

 

Neue Themen


Zurück
Oben