java.lang.NumberFormatException: For input string: ...

LadyMilka

Aktives Mitglied
Hallo zusammen,

ich hoffe ich bin hier im richtigen Unterforum.

In meinem Projekt arbeite ich mit Hibernate(3.2.5) und Spring(3.0.2).

Wenn ich in meiner JSP auf eine Ergebnismenge zugreife, erhalte ich folgende Exception:
java.lang.NumberFormatException: For input string: "uname"

meine meldung.jsp:
HTML:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Test 03</title>
    </head>
    <body>
        <h1>Hallo Benutzer </h1>
        <c:out value="${fn:length(myModel.warn)}" />
        <c:out value="${myModel.warn}" />
         <c:forEach items="${myModel.warn}" var="warns">
            <c:out value="${warns.uname}" />

        </c:forEach> 
        <c:out value="${fn:length(myModel.info)}" />
        <c:out value="${myModel.info}" />
    </body>
</html>

mein indexController.java:
Java:
public class indexController extends SimpleFormController{
    private Geschaeftslogik logik;
    private Object CommandTO="test";
    private String platzhalter="index";

    @Override
    protected Object formBackingObject(HttpServletRequest request)throws ServletException{
        return CommandTO;
    }

    public void setGeschaeftslogik(Geschaeftslogik logik){
        this.logik=logik;
    }

    @Override
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) {
        String bla=request.getParameter("testAuswahl");
        if(bla.equals("1")){
            [...]
        }
        if(bla.equals("2")){
            [...]
        }
        if(bla.equals("3")){
            System.out.println("3. Option gewählt");
            Map myModel=new HashMap();
            myModel.put("warn", logik.getWarnungen("mmuster", 2));
            myModel.put("info", logik.getWarnungen("mmuster", 1));
            return new ModelAndView("meldung", "myModel", myModel);
        }
        else{
            System.out.println("else");
            return new ModelAndView(platzhalter);
        }
    }
}

in der Geschaeftslogik.java wird diese Funktion aufgerufen:
Java:
public List getWarnungen(String name, Integer typ){
        return meldungen.getWarnungen(name, typ);
    }

MeldungenDAO.java:
Java:
public class MeldungenDAO extends HibernateDaoSupport{

    public List getWarnungen(String name, Integer typ){
        List test= getHibernateTemplate().findByNamedParam(
                "select u.uname, count(m.mid) as anzahl "
                + "FROM Meldungen as m, MeldungInfo as mi, User as u "
                + "WHERE m.uid=u.id AND u.uname= :name "
                + "AND m.mid=mi.id AND mi.typ= :typ group by uid",
                new String[]{"name", "typ"}, new Object[]{name, typ});
        return test;
    }
}

Hibernate generiert einen SQL-Befehl und dieser liefert mir auch ein Ergebniss, nur kann ich auf dieses nicht zugreifen.

Lade ich mit loadAll(), eine komplette Tabelle kann ich die einzelnen Spalten in einer JSP abfragen.

Ich hab schon an verschiedenen Stellen nach einer Lösung gesucht, allerdings nichts gefunden.
 
warum machst du sowas kompliziertes?
wäre es nicht angebracht, vorher einmal in normalen Java-Code zu versuchen,
> logik.getWarnungen("mmuster", 2)
komplett auszugeben?

die WarnListe ist nämlich anscheinend eine Liste von Object[],
jeder Eintrag, der dann am Ende durch
> <c:forEach items="${myModel.warn}" var="warns">
in der Variable warns steht, ist ein Object[], darauf kann man höchstens mit Index 0 oder 1 zugreifen, was soll
> <c😱ut value="${warns.uname}" />
bedeuten?

hättest du vorher in normalen Java geübt, etwa
Java:
List warnungen = ..;
for (was auch immer) {
   xy.getUname();
}
dann wäre dir dort mit genaueren Fehlermeldungen aufgefallen, dass das komplett nicht geht
 
uname ist eine Spalte des Ergebnisses.

aber wenn ich mit loadAll(); eine ganze Tabelle abfrage kann ich auf gleicher Weise wie oben beschrieben auf die Spalten zugreifen.

Java:
public List<User> selectAll() {        
            return getHibernateTemplate().loadAll(User.class);        
    }

HTML:
<table border="1" frame="void">
            <tr>
                <th>ID</th>
                <th>UserName</th>
                <th>Nachname</th>
                <th>Status</th>
                <th>Geschlecht</th>
            </tr>
            <c:forEach items="${myModel.user}" var="user">
                <tr>
                    <td><c:out value="${user.id}" /></td>
                    <td><c:out value="${user.uname}" /></td>
                    <td><c:out value="${user.nachname}" /></td>
                    <td><c:out value="${user.status}" /></td>
                    <td><c:out value="${user.gender}" /></td>
                </tr>
            </c:forEach>
        </table>

Java:
if(bla.equals("2")){
            System.out.println("2. Option gewählt");
            Map myModel=new HashMap();
            myModel.put("user", logik.selectAllUser());
            return new ModelAndView("test02", "myModel", myModel);
        }

dans ganze funktioniert ohne Probleme. Der Fehler tritt also nur auf, wenn ich die query selbst generiere.

das mit dem Javacode werd ich mal ausprobieren, vielleicht helfen die Fehlermeldungen dann weiter.
 
wie gesagt:
List<User> selectAll()
-> User mit getUname();

List getWarnungen()
-> Object[] mit Index 0/1

du kannst es so lassen und in der JSP Index 0/1 verwenden, oder dafür sorgen, dass statt Object[] andere Objekte in der Liste sind

ich persönlich nehme einfache Datenobjekte, hier etwa
Java:
public class UserRecord {
  private String uName;
  private int count; // evtl. long je nach Hibernate-Version

  // Konstruktor, setter, getter
}
dann liefert eine Query "select new package.UserRecord(u.uname, count(m.mid)) ... "
eine Liste von UserRecord-Objekte, die dann mit uname abfragbar sind

für andere Abfragen kann man die Klasse auch verwenden, mehr Attribute, mehr Konstruktoren
 
Danke für deine Antwort, hab jetzt begriffen was du meinst mit Object[] und über Indizes zugreifen.

Ich hab die JSP jetzt entsprechend geändert:
HTML:
<body>
        <c:forEach items="${myModel.warn}" var="warns">
            <h1>Hallo <c:out value="${warns[0]}" /> </h1>
            Sie haben
            <c:out value="${warns[1]}" /> Warnung(en) und
        </c:forEach> 
        <c:forEach items="${myModel.info}" var="infos">
            <c:out value="${infos[1]}" /> Information.
        </c:forEach>
    </body>

Ich hab für jede Tabelle, die in der DB enthalten ist, eine eigene Klasse mit getter und setter. Für die benutzte Abfrage greif ich allerdings auf 3 Tabellen zu. Ich werd mir mal überlegen ob ich noch eine entsprechende Klasse anlege die mein Ergebniss präsentiert.
 
je nach Nutzen im Programm kann man natürlich auch ganz andere Dinge machen, statt UserRecord etwa
Java:
public class MeldungRecord {
  private String user;
  private int count; // evtl. long je nach Hibernate-Version
 
  // Konstruktor, setter, getter
}
was dann sowohl Info als auch Warnung passt
 

Zurück
Oben