EntityManager wirft NullPointerException

Basti Spyra

Grünschnabel
Hallo.
Ich bin am verzweifeln.
Ich muss fürs Studium eine Webanwendung Mit EJB und JSF unter Glassfish entwickeln. Als Datenbank tut MySQL dienst.

Jetzt habe ich bekomme ich aus der Datenbank zwei IDs:
Code:
<h:dataTable value="#{bookingBean.cardByUser}" var="crd">
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="Von/Nach"/>
                        </f:facet>
                        <h:outputText value="#{crd.von}" />
                        <br />
                        <h:outputText value="#{crd.nach}" />
                    </h:column>
...

crd.von als auch crd.nach repräsentieren Städte. Nun möchte ich die IDs in die Stadtnamen konvertieren.
Gesagt getan:
Code:
<h:dataTable value="#{bookingBean.cardByUser}" var="crd">
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="Von/Nach"/>
                        </f:facet>
                        <h:outputText value="#{crd.von}" converter="convertcityid" />
                        <br />
                        <h:outputText value="#{crd.nach}" converter="convertcityid" />
                    </h:column>


Der CityConverter bekommt die ID und soll eine bestehende Funktion in der SessionBean aufrufen, die dazu den Stadtnamen liefert:

Code:
public class CityConverter implements Converter, Serializable
{ 
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        return value;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        int city_id = (Integer)value;
        String output = new journeySession().getCityById(city_id);
        return output;
    }
}


Code:
public class journeySession implements journeySessionRemote
{
    @PersistenceContext
    protected EntityManager em;
...
@Override
    public String getCityById(int city_id)
    {
        try
        {
            Query query = em.createNamedQuery("Cities.findByCityId").setParameter("cityId", city_id);
            return query.getSingleResult().toString();
        }
        catch(NoResultException nrex)
        {
            return "Es konnten keine Einträge gefunden werden.";
        }
    }
...
}



Jedoch bekomme ich eine java.lang.NullPointerException beim Aufruf.

Code:
Stack Trace

java.lang.NullPointerException
	at sessions.journeySession.getCityById(journeySession.java:152)  //Aufruf des EntityManagers
	at katipo.CityConverter.getAsString(CityConverter.java:25) //Aufruf der journeySession
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:502)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:521)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:340)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:295)
	at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:380)
	at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:161)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
	at java.lang.Thread.run(Thread.java:619)


Bin ein ziemlicher Java****, hoffe aber auf eure Hilfe :)
 

vfl_freak

Premium-User
Moin,

die spannende Frage ist, in welcher Zeile das genau auftritt (Zeile 155 sehe ich nicht :-D ).
Ich würde aber mal vermuten, das die "city_id" null ist ......

Warum genau, wird Dir wohl nur der Debugger sagen ;-)

Gruß
Klaus
 

Basti Spyra

Grünschnabel
Die city_id ist nicht Null.
Die NullPointerException tritt beim Aufruf des EntityManagers auf.
[at sessions.journeySession.getCityById(journeySession.java:152) //Aufruf des EntityManagers]

Habe zur Sicherheit nochmal alle Werte mit System.out.print in die Konsole schreiben lassen. Alles da. Nur wenn ich über den EntityManager die Query absetzen will kann er diesen (offenbar) nicht mehr finden. Bei anderen Methoden, die nicht über einen Konverter aufgerufen werden funktioniert er aber.
 

vfl_freak

Premium-User
Moin,

schön und gut, nur sehe ich diesen Aufruf noch immer nicht :rolleyes:
Java:
sessions.journeySession.getCityById(journeySession.java:152)  //Aufruf des EntityManagers

Wenn Du sicher bist, dass die "city_id" nicht NULL ist, dass wird es an der Stelle halt entweder "journeySession" oder halt "sessions" sein ....

Ohne den Code wird da keiner was zu sagen können !

Gruß
Klaus
 

Basti Spyra

Grünschnabel
Der Aufruf steht doch im Start-Beitrag: :confused:
vgl: public class journeySession im vierten Codeblock im Start-Beitrag
Was dort Zeile 11 ist ist in "Wirklichkeit" Zeile 152
Mit protected EntityManager em; wird er initialisiert und über
Query query = em.createNamedQuery("Cities.findByCityId").setParameter("cityId", city_id);
aufgerufen.

Um sicher zugehen, dass auch alles ankommt was er braucht, habe ich mit System.out.print("JNY ctyID: " + city_id); die übergebene "city_id" übergeben - mit Erfolg. In der Konsole steht JNY ctyID: 1.

Wenn ich jedoch System.out.print("Entity: " + em); schreibe wirft er die NullPointer. Eigentlich sollte ja die Objektreferenz ausgeben.

Wenn ich die Funktion von einem anderen Ort (bspw. einer ManagedBean) als dem Converter anspreche funktioniert sie auch tadellos - also die Logik stimmt ;)
 

Basti Spyra

Grünschnabel
Habs raus bekommen!

Wenn die Methode über einen Konverter aufgerufen wird, muss der EntityManager in der Methode selbst initialisiert werden.

Mit
Code:
String jndiEntityManagerFactory = "<Persistence Name>";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(jndiEntityManagerFactory);
EntityManager entityManager = factory.createEntityManager();
hat's schließlich funktioniert.

Java, ick liebe dir! :rolleyes: