Hallo,
nach einer etwas längern Pause wollte ich mich nochmal mit dem Thema JEE beschäftigen. Ich habe mir Eclipse, Glassfish und Postgres besorgt.
Was ich bisher gemacht hab ist eine Tabelle EinnahmeArt anzulegen und mit ein paar Werten zu füllen. Dann habe ich eine Klasse EinnahmeArt angelegt. Sowie eine Klasse(ManagedBean) EinnahmeAnlegenController und ein Servlet EinnahmeAnlegen.xhtml. Auf EinnahmeAnlegen.xhtml kann der Benutzer Betrag Datum und EinnahmeArt angeben. EinnahmeArt soll eine Combobox sein. Die Werte für die ComboBox hole ich natürlich aus der Datenbank.
=>Ziel ist es also eine Seite anzuzeigen, wo der Benutzer aus einer Combobox einen Wert auswählen kann, wobei die Liste aus einer Datenbank kommt.
Die Fehlermeldung die ich bekomme ist:
und im Glassfish log steht:
Ich würde vermuten, dass es irgendwie an dem Converter liegt. Die Meldung aus dem Glassfish log java.lang.ClassCastException: java.lang.String cannot be cast to EinnahmeArt at converterEinnahmeArt.getAsString(ConverterEinnahmeArt.java:13) verwundert mich. Die Meldugn besagt ja, dass der String nicht zu EinnahmeArt gecastet werden kann. Das will ich aber ja auch gar nicht. Eigentlich möchte ich ja für die Combobox das Objekt in einen String casten.
Hier für euch der wichtige Code vom View Richtung Datenbank. Ich würde mich freuen, wenn sich einer die Zeit nimmt sich das anzuschauen. Ich weiß es ist etwas viel.
EinnahmeAnlegen.xhtml
EinnahmeAnlegenController (ManagedBean)
EinnahmeArt
faces-config.xml
ConverterEinnahmeArt
Frage: sehe ich das richtig. Bei der Anzeige der Combobox sollte eigentlich getAsString aufgerufen werden und nach der Auswahl getAsObject?
Gruß hyperion
nach einer etwas längern Pause wollte ich mich nochmal mit dem Thema JEE beschäftigen. Ich habe mir Eclipse, Glassfish und Postgres besorgt.
Was ich bisher gemacht hab ist eine Tabelle EinnahmeArt anzulegen und mit ein paar Werten zu füllen. Dann habe ich eine Klasse EinnahmeArt angelegt. Sowie eine Klasse(ManagedBean) EinnahmeAnlegenController und ein Servlet EinnahmeAnlegen.xhtml. Auf EinnahmeAnlegen.xhtml kann der Benutzer Betrag Datum und EinnahmeArt angeben. EinnahmeArt soll eine Combobox sein. Die Werte für die ComboBox hole ich natürlich aus der Datenbank.
=>Ziel ist es also eine Seite anzuzeigen, wo der Benutzer aus einer Combobox einen Wert auswählen kann, wobei die Liste aus einer Datenbank kommt.
Die Fehlermeldung die ich bekomme ist:
Code:
exception
javax.servlet.ServletException: java.lang.String cannot be cast to EinnahmeArt
root cause
java.lang.ClassCastException: java.lang.String cannot be cast to EinnahmeArt
und im Glassfish log steht:
Code:
Error Rendering View[/EinnahmeAnlegen.xhtml] java.lang.ClassCastException: java.lang.String cannot be cast to EinnahmeArt at ConverterEinnahmeArt.getAsString(ConverterEinnahmeArt.java:13) at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:519) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:534) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:792) at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:844) at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:298) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) at
...
Ich würde vermuten, dass es irgendwie an dem Converter liegt. Die Meldung aus dem Glassfish log java.lang.ClassCastException: java.lang.String cannot be cast to EinnahmeArt at converterEinnahmeArt.getAsString(ConverterEinnahmeArt.java:13) verwundert mich. Die Meldugn besagt ja, dass der String nicht zu EinnahmeArt gecastet werden kann. Das will ich aber ja auch gar nicht. Eigentlich möchte ich ja für die Combobox das Objekt in einen String casten.
Hier für euch der wichtige Code vom View Richtung Datenbank. Ich würde mich freuen, wenn sich einer die Zeit nimmt sich das anzuschauen. Ich weiß es ist etwas viel.
EinnahmeAnlegen.xhtml
Code:
<h:outputText value="Art:" />
<h:selectOneMenu>
<f:selectItems value="#{einnahmeAnlegenController.einnahmeArten}"/>
<f:converter converterId="converterEinnahmeArt"/>
</h:selectOneMenu>
EinnahmeAnlegenController (ManagedBean)
Code:
public List<SelectItem> getEinnahmeArten(){
try {
return EinnahmeArt.getEinnahmeArten();
} catch (SQLException e) {
List<SelectItem> a = new ArrayList<SelectItem>();
a.add(new SelectItem("test SQL"));
return a;
} catch(ClassNotFoundException e){
List<SelectItem> a = new ArrayList<SelectItem>();
a.add(new SelectItem("test Class"));
return a;
}
}
EinnahmeArt
Code:
public static List<SelectItem> getEinnahmeArten() throws ClassNotFoundException, SQLException{
Statement st = null;
ResultSet rs = null;
List<SelectItem> einnahmeArten = new ArrayList<SelectItem>();
st = DBUtil.getStatement();
rs = st.executeQuery("SELECT \"EinnahmeArtID\", \"Text\" FROM \"EinnahmeArt\";");
while (rs.next()) {
EinnahmeArt einnahmeArt = new EinnahmeArt();
einnahmeArt.setEinnahmeArtID(rs.getInt("EinnahmeArtID"));
einnahmeArt.setText(rs.getString("Text"));
einnahmeArten.add(new SelectItem(einnahmeArt));
}
rs.close();
DBUtil.closeStatement(st);
return einnahmeArten;
}
faces-config.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
version="2.1">
<converter>
<converter-id>converterEinnahmeArt</converter-id>
<converter-class>ConverterEinnahmeArt</converter-class>
</converter>
</faces-config>
ConverterEinnahmeArt
Frage: sehe ich das richtig. Bei der Anzeige der Combobox sollte eigentlich getAsString aufgerufen werden und nach der Auswahl getAsObject?
Code:
public class ConverterEinnahmeArt implements Converter {
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
return EinnahmeArt.getByID(Integer.parseInt(arg2));
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return ((EinnahmeArt)arg2).toString();
}
}
Gruß hyperion