# EM ist (null)



## FINF_AW_Alex (28. Feb 2015)

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)

```
@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) )

```
@ManagedBean
public class CustomerBean {
    
    
    public void test(){
    
    (new TestBean()).isAllowed();
    
    }    
}
```


```
<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>
```


----------



## stg (28. Feb 2015)

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 (1. Mrz 2015)

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..... :-(


----------



## FINF_AW_Alex (2. Mrz 2015)

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 (2. Mrz 2015)

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.


----------



## FINF_AW_Alex (2. Mrz 2015)

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 (2. Mrz 2015)

FINF_AW_Alex hat gesagt.:


> 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:
	
	
	
	





```
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...)


----------



## FINF_AW_Alex (2. Mrz 2015)

okay, krass !!

ist ja ein Hammer Ding !!

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


----------



## stg (2. Mrz 2015)

Hab den Code oben ausgebessert...


----------



## FINF_AW_Alex (2. Mrz 2015)

<---||  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 (2. Mrz 2015)

FINF_AW_Alex hat gesagt.:


> 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 (2. Mrz 2015)

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? ;(


----------



## FINF_AW_Alex (2. Mrz 2015)

stg hat gesagt.:


> ... 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



das stimmt !! Wenn man dran bleibt hat man immer öfters Momente der Erleuchtung


----------



## stg (2. Mrz 2015)

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 (2. Mrz 2015)

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


----------

