Webapplikation - Server hängt sicht auf und gibt NullPointerException nach weiteren Einträgen

Cr0wN

Grünschnabel
Hallo zusammen,

mit Bootstrap haben einige Dinge nicht funktioniert und ich bin auf ZURB Foundation umgestiegen. Funktioniert problemlos.

Allerdings habe ich ein Problem sobald die Seite erneut aufgerufen wird. Es wird dauernd "Verbindung" angezeigt und nach einer bestimmten Zeit kommt folgende Fehlermeldung:

HTTP Status 500 -
type Exception report

message

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.42 logs.

Der Controller ist folgender:
Java:
@Controller
public class AquaCtrl {
    private static Logger log = Logger.getLogger(AquaCtrl.class);
    private AquaDao aquaDao = null;
    public void setAquaDao(AquaDao aquaDao) {
        this.aquaDao = aquaDao;
    }
  
     /* mapping for saving a new aqua entry into database */
        @RequestMapping(value = "/saveAqua.html", method = RequestMethod.POST)
        public String save(Aqua aqua, Model model, Integer id, String name,
                Integer breite, Integer hoehe, Integer tiefe, Integer volumen) {
            try {
                aquaDao.save(aqua);
                log.debug("Entering the databaseentry was sucessfully - method save");
            } catch (Exception ex) {
                log.error("Error by entering the databaseentry - method save");
            }
            return "redirect:aqua.html";
        }
      
    /* mapping for displaying all aqua entries as a list on view aqua.jsp */
    @RequestMapping(value = "/aqua.html", method = RequestMethod.GET)
    public ModelAndView display(Aqua aqua, Model model) throws Exception {
        ModelAndView mv = new ModelAndView();
      
        try {
            log.debug("try to load the data");
            model.addAttribute("aqua", aquaDao.aquaLoad());
            model.addAttribute("aqua_options", aquaDao.aquaLoad());
            mv.setViewName("aqua");
            log.debug("Loading and display the data was successfully - method display");
        } catch (Exception ex) {
            log.error("Error by loading the data and displaying the view - method display");
        }
        return mv;
    }
  
    /* mapping for changing aqua entry in database */
    @RequestMapping(value = "/changeAqua.html", method = RequestMethod.POST)
    public String change(Aqua aqua, Model model, Integer id, String newname,
            Integer newbreite, Integer newhoehe, Integer newtiefe, Integer newvolumen) {
        try {
            aquaDao.update(aqua);
            log.debug("Changing the databaseentry was sucessfully - method change");
        } catch (Exception ex) {
            log.error("Error by changing the databaseentry - method change");
        }
        return "redirect:aqua.html";
    }
  
    /* mapping for deleting aqua entry in database */
    @RequestMapping(value = "/deleteAqua.html", method = RequestMethod.POST)
    public String delete(Aqua aqua, Model model, Integer id) {
        try {
            aquaDao.delete(aqua);
            log.debug("Deleting the databaseentry was sucessfully - method delete");
        } catch (Exception ex) {
            log.error("Error by deleting the databaseentry - method delete");
        }
        return "redirect:aqua.html";
    }
}

Und die jsp ist diese hier:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- binding the head-data -->
<jsp:include page="head.htm" />
<title>Verwaltung - Aquarium</title>
<script>
    function calc() {
        var breite = document.getElementById("breite").value;
        var hoehe = document.getElementById("hoehe").value;
        var tiefe = document.getElementById("tiefe").value;
        document.getElementById("volumen").value = (breite * hoehe * tiefe) / 1000;
    }
    function newcalc() {
        var breite = document.getElementById("newbreite").value;
        var hoehe = document.getElementById("newhoehe").value;
        var tiefe = document.getElementById("newtiefe").value;
        document.getElementById("newvolumen").value = (breite * hoehe * tiefe) / 1000;
    }

    function selmodelcalc() {
        var breite = document.getElementById("selbreite").value;
        var hoehe = document.getElementById("selhoehe").value;
        var tiefe = document.getElementById("seltiefe").value;
        document.getElementById("selvolumen").value = (breite * hoehe * tiefe) / 1000;
    }

    function aqua_select(value) {
        var selName = value;
        var breite;
        var hoehe;
        var tiefe;
        var name;
        var id;
        <c:forEach var="aqua" items="${aqua}" varStatus="status">
        var Name = "<c:out value="${aqua.name}"/>";
        if (Name == selName) {
            id = "<c:out value="${aqua.id}"/>";
            name = "<c:out value="${aqua.name}"/>";
            breite = "<c:out value="${aqua.breite}"/>";
            hoehe = "<c:out value="${aqua.hoehe}"/>";
            tiefe = "<c:out value="${aqua.tiefe}"/>";
            document.getElementById("selid").value = id;
            document.getElementById("selname").value = name;
            document.getElementById("selbreite").value = breite;
            document.getElementById("selhoehe").value = hoehe;
            document.getElementById("seltiefe").value = tiefe;
            selmodelcalc(breite, hoehe, tiefe);
        }
        </c:forEach>
    }
</script>

</head>



<body>
    <!-- including menu.htm, header.jsp and some scripts to showing the modals for creation, changing and deleting -->
    <jsp:include page="menu.htm" />
    <jsp:include page="header.jsp" />
    <script src="ressources/foundation/js/vendor/jquery.js"></script>
    <script src="ressources/foundation/js/foundation.min.js"></script>
    <script src="ressources/foundation/js/foundation/foundation.reveal.js"></script>

    <div class="row">
        <a href="#" data-reveal-id="aqua_create" class="button tiny">Aquarium
            hinzufügen</a> <a href="#" data-reveal-id="aqua_change"
            class="button tiny">Aquarium ändern</a> <a href="#"
            data-reveal-id="aqua_delete" class="button tiny">Aquarium löschen</a>

        <!-- modal for creating a new aqua entry -->
        <div id="aqua_create" class="reveal-modal" data-reveal>
            <div class="row">
                <form action="saveAqua.html" method="post">
                    <div class="row">
                        <h3>Aquarium hinzufügen</h3>
                        <div class="large-8 columns">
                            <label>Name <input type="text" placeholder="" id="name"
                                required="" name="name" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-4 columns">
                            <label>Breite/cm <input type="text" placeholder=""
                                name="breite" id="breite" onchange="calc();" required="" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>Höhe/cm <input type="text" placeholder=""
                                name="hoehe" id="hoehe" onchange="calc();" required="" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>Tiefe/cm <input type="text" placeholder=""
                                name="tiefe" id="tiefe" onchange="calc();" required="" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-4 columns">
                            <label>Volumen/l <input type="text" placeholder=""
                                name="volumen" id="volumen" readonly="readonly" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-12 columns">
                            <input type="submit" value="Aquarium hinzufügen"
                                class="button tiny" />
                        </div>

                    </div>
                </form>
                <a class="close-reveal-modal">&#215;</a>
            </div>
        </div>

        <!-- modal for changing a aqua entry -->
        <div id="aqua_change" class="reveal-modal" data-reveal>
            <div class="row">
                <form action="changeAqua.html" method="post">
                    <div class="row">
                        <h3>Aquarium ändern</h3>
                        <div class="large-4 columns">
                            <label>Aquarium-Name <select
                                onchange="aqua_select(value);">
                                    <c:forEach items="${aqua}" var="aqua">
                                        <option><c:out value="${aqua.name}" /></option>
                                    </c:forEach>
                            </select>
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-8 columns">
                            <label>Name <input type="text" name="selname"
                                id="selname" readonly="readonly" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-8 columns">
                            <label>Name <input type="hidden" id="selid" name="id" />
                                <input type="text" id="name" required="" name="name" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-4 columns">
                            <label>Breite/cm <input type="text" name="selbreite"
                                id="selbreite" readonly="readonly" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>Höhe/cm <input type="text" name="selhoehe"
                                id="selhoehe" readonly="readonly" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>Tiefe/cm <input type="text" name="seltiefe"
                                id="seltiefe" readonly="readonly" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-4 columns">
                            <label>neue Breite/cm <input type="text" placeholder=""
                                name="breite" id="newbreite" onchange="newcalc();" required="" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>neue Höhe/cm <input type="text" placeholder=""
                                name="hoehe" id="newhoehe" onchange="newcalc();" required="" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>neue Tiefe/cm <input type="text" placeholder=""
                                name="tiefe" id="newtiefe" onchange="newcalc();" required="" />
                            </label>
                        </div>
                    </div>
                    <div class="row">
                        <div class="large-4 columns">
                            <label>Volumen/l <input type="text" name="selvolumen"
                                id="selvolumen" readonly="readonly" />
                            </label>
                        </div>
                        <div class="large-4 columns">
                            <label>neues Volumen/l <input type="text" name="volumen"
                                id="newvolumen" readonly="readonly" />
                            </label>
                        </div>

                    </div>
                    <div class="row">
                        <div class="large-12 columns">
                            <input type="submit" value="Aquarium ändern" class="button tiny" />
                        </div>

                    </div>
                </form>
                <a class="close-reveal-modal">&#215;</a>
            </div>
        </div>


        <div id="table">
            <table border="2" class="aqua_table">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Breite/cm</th>
                        <th>Hoehe/cm</th>
                        <th>Tiefe/cm</th>
                        <th>Volumen/l</th>
                    </tr>
                </thead>
                <tbody>
                    <c:forEach items="${aqua}" var="aqua">

                        <tr>
                            <td><c:out value="${aqua.name}" /></td>
                            <td><c:out value="${aqua.breite}" /></td>
                            <td><c:out value="${aqua.hoehe}" /></td>
                            <td><c:out value="${aqua.tiefe}" /></td>
                            <td><c:out value="${aqua.volumen}" /></td>

                        </tr>
                    </c:forEach>
                </tbody>
            </table>
        </div>
    </div>

    <script>
        $(document).foundation();
    </script>

    <jsp:include page="copyright.jsp" />
</body>
</html>

Funktionieren soll das ganze so:

Bei Klick auf "Aquarium hinzufügen" erscheint eine Form in welcher Daten eingegeben werden können. Beim Klicken auf den Button hinzufügen wird "saveAqua.html" aufgerufen, welche im Controller die Daten in der Datenbank speichert und wieder die aqua.jsp ausgibt in welcher eine Tabelle ist, die immer beim Aufruf einen Fullload der Datenbanktabelle macht und in einer Tabelle in der View ausgibt.

Beim Hinzufügen des ersten Eintrages funktioniert das wunderbar. Der Eintrag wird gespeichert, die Seite neu geladen und der Eintrag erscheint in der Tabelle. Möchte ich allerdings einen weiteren Eintrag hinzufügen lädt die Seite ununterbrochen und nach einer gewissen Zeit kommt dann diese NullPointerException. Ich geh schwer davon aus, dass einfach irgendwo irgendwer überfordert ist. Aber ich weiß nicht wo ich anfangen soll, dem Problem nachzugehen bzw. es zu lösen. Vielleicht kann mir jemand helfen?

Gruß,
Steffi
 

Cr0wN

Grünschnabel
Fall's jemand ähnliche Probleme haben sollte:

Die Methode zieht sich jedesmal eine neue Session, wodurch das Problem enstanden ist. Ich hab nun in den entsprechenden Konfigurationen die
einfach höher gesetzt. Entsprechend funktioniert es auch, wenn in der Methode selbst die Session geschlossen wird.

Code:
hibernateSession.close();