Skip to content
This repository was archived by the owner on Sep 18, 2020. It is now read-only.

Backend Fehler einer Bar melden

Jonas Stegmaier edited this page Jan 21, 2015 · 8 revisions

← zurück zur Backend-Logik Übersicht

Autor: Jonas

Der Anwendungsfall "Fehler einer Bar melden" wurde in der Use Case Beschreibung genau definiert. Die Schnittstelle zwischen Frontend und Backend ist unter diesem Link zu sehen.

Kurzprofil der Funktion

Definition: Durch diese Funktion wird eine neue Fehlermeldung zu einer Bar in der H2 Datenbank gespeichert
Modul: BarReport
Dateiname: BarReport.java
HTTP: POST
Pfad: /bars/:barID/reports

Folgende Klassen wurden erstellt, um die Speicherung einer gemeldeten Bars in der Datenbank zu ermöglichen:

Die erstellten Funktionen

Die Datenklasse

Als erster Schritt wird eine Models-Klasse BarReport.javaangelegt. Dies ist die Datenklasse in der die Variablen: id, barID, description gespeichert werden. Diese drei Variablen beschreiben eine gemeldete Bar, wie sie in der Datenbank abgelegt ist.

private int id = 0;
private String barID = "";
private String description = "";

Des Weiteren sind in dieser Klasse die Getter- und Setter-Methoden sowie eine toString Methode abgebildet.

Das DAO Interface

Um ein Datenobjekt der Klasse BarReport.java mit den Daten aus der Datenbank zu befüllen, wurde das Interface BarReportDAO.java in dem Package de.dhbw.hh.dao erstellt. Dieses Interface enthält alle Methoden, durch die die Daten der gemeldeten Bars bearbeitet oder abgefragt werden können. Für die Speicherung einer gemeldeten Bar ist folgende Methode relevant:

/**
 * Diese Funktion fügt ein BarReport in die Datenbank ein.
 *
 * @param barReport Der einzufügende BarReport.
 * @return True bei Erfolg, andernfalls false.
 */
public boolean insertBarReport(BarReport barReport);

Die BarReportDAO.java-Klasse kann in der DAOFactory.java-Klasse zurückgegeben werden, dafür ist folgende Funktion zuständig:

public abstract BarReportDAO getBarReportDAO();

Die Funktion der DAOFactory.java-Klasse ist unter Standardablauf beschrieben.

Die Speicher-Funktionen

Als nächstes wird eine H2BarReportDAO.java-Klasse im de.dhbw.hh.dao.h2 Package hinzugefügt. Diese Klasse soll direkt mit der H2-Datenbank kommunizieren und die im BarReportDAO.java Interface definierten Funktionen bereitstellen, daher implementiert diese Klasse das Interface BarReportDAO.java:

public class H2BarReportDAO implements BarReportDAO {
...
}

Zuerst werden wie für den Standardablauf üblich ein Logger für die Fehlerausgabe initialisiert, eine Variable zum Connectionpool der Datenbank und ein Konstruktor erstellt. Dieser Konstruktor erstellt ein Objekt der H2BarReportDAO.java-Klasse. Als Parameter wird die Variable des Connectionpools mit übergeben.

/**
 * Diese Funktion erstellt ein Objekt der Klasse H2BarReportDAO.
 *
 * @param cpds Der Connectionpool
 */
public H2BarReportDAO(ComboPooledDataSource cpds) {
    this.cpds = cpds;
}

Nachfolgend kommen die einzelnen Methoden der Datenbankspeicherung für die BarReport.java-Datenklasse. Für die Speicherung einer gemeldeten Bar wird die folgende Methode des Interface überschrieben: public boolean insertBarReport(BarReport barReport);.

Zunächst beginnt die Erstellung eines SQL-Strings.
Der SQL-String für das Speichern einer gemeldeten Bar in der H2 Datenbank:
String sql = "INSERT INTO barReport (barID, description) VALUES (?,?)";

Nun wird innerhalb eines try-catch-Blocks versucht aus dem Connectionpool eine Connection zu H2 Datenbank zu holen. Dabei wird, wie in den festgesetzten verwendeten Frameworks beschrieben, das automatische Commiten zur Datenbank verboten. Mit einem weiteren try-catch-Block wird ein Prepared Statement zur Datenbankansteuerung erstellt (Prepared Statements sind ebenfalls in den festgesetzten verwendeten Frameworks beschrieben). In dem Prepared Statement wird der SQL-String ausgeführt und bei erfolgreicher Ausführung wird ein true zurück gegeben:

try (Connection connection = cpds.getConnection()) {
    // Immer ohne Autocommits arbeiten
    connection.setAutoCommit(false);

    // Immer mit PreparedStatements arbeiten
    try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, barReport.getBarID());
        preparedStatement.setString(2, barReport.getDescription());

        // Füge das Statement der Ausführungsschlange hinzu
        preparedStatement.addBatch();

       // Führe alle Statements aus
       preparedStatement.executeBatch();
    }

    // Schreibe die Änderungen in die Datenbank
    connection.commit();
    return true;

Die REST-Schnittstelle

In der Klasse ReportsREST im package *de.dhbw.hh.rest werden verschiedene Methoden für gemeldete Bars zur Verfügung gestellt. Zur Speicherung einer gemeldeten Bar stellt diese Klasse die Methoden für die REST-Schnittstelle zum Frontend über den Pfad /bars/:barID/reports bereit.
Zuerst wird ein Gson-Objekt erstellt, um mit diesem später Json umzuwandeln. Im Konstruktor werden die REST-Schnittstellen definiert, dem Konstruktor wird als Parameter dabei die daoFactory übergeben:

public ReportsREST(DAOFactory daoFactory) {
...
}

In diesem Konstruktor wird die Spark-Funktion post() für einen HTTP-POST Aufruf auf den Pfad /bars/:barID/reports definiert. Hierbei wird über die DAOFactory die Funktion insertBarReport(BarReport barReport) aufgerufen und dadurch eine gemeldete Bar in der Datenbank gespeichert. In einem neuen ´RESTResponse´-Rückgabeobjekt wird sowohl der angefragte Pfad als Name als auch der aktuelle Zeitpunkt der Rückgabe gesetzt. Anschließend folgt eine if-Abfrage, in der überprüft werden, ob die Speicherung erfolgreich durchgeführt wurde oder nicht und je nachdem werden die Parameter des Rückgabeobjekts befüllt, wobei die Datenvariable leer (null) bleibt:

if (successfull) {
    // Antwort bei erfolgreichem Schreiben in DB
    restResponse.setDescription("BarReport erfolgreich in DB geschrieben");
    restResponse.setSuccess();
} else {
    // Antwort bei nicht erfolgreichem Schreiben in DB
    restResponse.setDescription("Es gab einen Fehler beim Schreiben des BarRepors in die DB");
    restResponse.setError();
}
restResponse.setData(null);

Als Ergebnis wird das Rückgabeobjekt umgewandelt und als Json zurückgegeben: return gson.toJson(restResponse);
Die REST-Schnittstelle ReportsREST.java ist außerdem als REST-Modul in die Spark-Klasse eingebunden, sodass sie für den Server zur Verfügung steht und aufgerufen werden kann.

Clone this wiki locally