EM ist (null)

FINF_AW_Alex

Aktives Mitglied
Hey liebe JAVA Gemeinde!

Ich hab denke ich ein sehr simples Problem was aber gerade meinen Horizont übersteigt oder ich befinde mich gerade einfach im Projektkoller weil ich nächste Woche Abgabe habe.
Ich hoffe auf jeden Fall ihr könnt mir helfen.

Ich habe eine Anwendung mit einer EntityKlasse, einer ControllerBean und einer TestBean.

Die Methode isAllowed() in der ControllerBean erzeugt ein neues EntityObjekt und gleicht es mit der Datenbank ab.

Wenn ich in meiner View die Methode direkt aufrufe geht alles.

Ich möchte aber die Methode aus einer anderen Klasse oder Package heraus aufrufen, wenn ich das mache ist mein EntityManager immer "null".

Ich weiss nicht genau wie ich das anstelle das der EntityManager richtig injected wird, kann mir da jemand helfen?

Das wäre total super, ich bin am verzweifeln! Vielen Dank im voraus !!


ControllerBean: (von hier aufgerufen geht die Methode)
Java:
@ManagedBean
public class TestBean {
    
    
    @PersistenceContext
    EntityManager em;

    
    public void isAllowed(){
    
    Customer c1 = new Customer(1);   
    
    int id = c1.getCustomerId();
       
    Query query = em.createNativeQuery("SELECT customer_id from customer where customer_id = "+id+"");
    
    if (query.getResultList().isEmpty())
        System.out.println("kein Eintrag");
        else System.out.println("Eintrag gefunden!");    
    }   
}

TestBean: (von hier aufgerufen ist der EM (null) )
Java:
@ManagedBean
public class CustomerBean {
    
    
    public void test(){
    
    (new TestBean()).isAllowed();
    
    }    
}
HTML:
    <h:body>       
        <h:form>
            <h:commandButton action="#{testBean.isAllowed()}" value="Methode von intern"/>
            <h:commandButton action="#{customerBean.test()}"  value="Methode von extern"/>
        </h:form>    
    </h:body>
 
Zuletzt bearbeitet:

stg

Top Contributor
Wer erstellt wann und wo die Instanz von TestBean im ersten Fall?
Und wer erstellt wann und wo die Instanz von TestBean im zweiten Fall?!

Reicht dir das schon als Antwort? :)
 

FINF_AW_Alex

Aktives Mitglied
leider nein :-(

im ersten fall hab ich keine Ahnung

und im zweiten fall wird in der CustomerBean wird doch mit: ( new TestBean()).isAllowed(); eine Instanz (auch vom EM) erstellt.


oder?

....ich fühl mich gerade als hätte ich was sehr wichtiges nicht verstanden..... :-(
 
Zuletzt bearbeitet:

FINF_AW_Alex

Aktives Mitglied
Ich denke im ersten fall wird die bean beim erstellen der anwendung von Glassfish bereitgestellt...

Aber ich hab immer noch keine Ahnug wie mir das jetzt weiterhilft ;( ;( ;(
 

stg

Top Contributor
Der wesentliche Unterschied ist, dass im ersten Fall eine echte ManagedBean vorliegt, sprich eine vom JSF Framework gemanaged Bean. Bei Bedarf wird für dich vollkommen transparent automatisch eine Instanz erzeugt. Während dies geschieht greift auch die Dependency Injeciton vom EntityManager. Im zweiten Fall erstellst du selbst einfach nur eine Instanz der Klasse TestBean. Dadurch ist sie aber noch lange nicht 'von außerhalb' gemanaged. Die DI greift hier nicht.
Wenn du du eine gemanagete Instanz von TestBean in deiner zweite Bean benutzen möchtest, dann musst du dir auch eine ebensolche beschaffen und nicht einfach selbst eine Instanz der Klasse erstellen (z.B. aus dem EL context).
Vielmehr sieht mir das hier aber nach einem konzeptuellen Problem aus, welches du ggfls angehen solltest.
 
Zuletzt bearbeitet:

FINF_AW_Alex

Aktives Mitglied
hey stg, danke für die Aufklärung, ich hatte mir sowas schon gedacht aber konnte es nicht in Worte fassen.

kannst Du mir vielleicht sagen wie ich das mit dem "beschaffen" in diesem Fall am besten anstelle?

----
Ich weiss es ist noch nicht die optimalste Lösung, aber ich habe auch andere Sachen versucht und das hier ist im Moment der Ansatz den ich zeitlich vielleicht noch auf die Reihe bekomme....

Wenn es dann läuft und ich mehr Zeit habe würde ich mich nochmal in Ruhe in die EJB´s einlesen und es vermutlich mit einer Singleton Bean machen, ich bekomm das aber im Moment nicht auf die Reihe... :-(
 

stg

Top Contributor
h
kannst Du mir vielleicht sagen wie ich das mit dem "beschaffen" in diesem Fall am besten anstelle?

Sagte ich doch bereits ... aus dem EL context!

zum Beispiel:
Java:
 public void test() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ((TestBean) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "testBean")).isAllowed();
}

(ist jetzt ohne IDE Überprüfung einfach runtergeschrieben, Klammersetzung usw solltest du selbst nochmal prüfen...)
 
Zuletzt bearbeitet:

FINF_AW_Alex

Aktives Mitglied
okay, krass !!

ist ja ein Hammer Ding !!

ich hab es versucht aber bekomme probleme mit der getValue Methode......

Neue Bitmap.jpg
 
Zuletzt bearbeitet:

FINF_AW_Alex

Aktives Mitglied
<---|| DU BIST EIN GOTT ||--->

Ich verneige mich !!

vielen vielen Dank!!

sag mal by the Way, wieviele Jahre muss man Java programmieren um so den Durchblick zu haben? :)
 

stg

Top Contributor
wieviele Jahre muss man Java programmieren um so den Durchblick zu haben?

Ich würde nicht sagen, dass ich "so den Durchblick" habe, sondern ich hab auch noch einen riesigen Berg vor mir, den es zu lernen gibt. Wie schnell es damit vorran geht, hängt natürlich stark davon ab, wie intensiv man sich damit beschäftigt / beschäftigen kann. Ich mach nun seit knapp 3 Monaten nichts anderes, und in der Zeit hab ich den größten "Sprung" gemacht.
Man muss einfach weitermachen... und alle paar Monate (oder auch nur Wochen) rauft man sich die Haare, wenn man sieht, was man kürzlich erst noch für einen Mist geschrieben hat :)
 

FINF_AW_Alex

Aktives Mitglied
Oh, und ich habe noch ein Problem entdeckt :autsch:

Wenn eine andere Klasse nun auch auf diese Methode mit dem selben Aufruf zugreifen will bekomme ich ein Problem... :-(

Glassfish meint dazu:

Warnung: JSF1074: Verwalteter Bean mit dem Namen 'secureControler' wurde bereits registriert. Ersetzen des bestehenden Klassentyps des verwalteten Beans setix.security.SecureControler durch setix.secure.acl.SecureControler.

im SecureControler befindet sich meine isAllowed Methode...

heißt das jetzt ich kann nur eine Methode auf meine isAllowed Methode zugreifen lassen? ;(
 

stg

Top Contributor
Hast du wirklich zwei Klasse mit dem Namen "secureController" als Bean registiert?
Einmal `setix.security.SecureControler` und einmal `setix.secure.acl.SecureControler`
Du hast ja ganz offenbar zwei Klasse mit dem gleichen Namen in zwei verschiedenen packages. Wenn du beide unter dem gleichen Namen als ManagedBean registrierst, dann hast du hier ganz einfach einen Namenskonflikt.
 

FINF_AW_Alex

Aktives Mitglied
Hehe, das wärs ja, ne hab ich nicht.... also das Programm läuft aber die MEldung bekomm ich trotzdem... ?!?

02.jpg
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben