# Webservice: Telefonbuch (DB)



## Olaf777 (30. Nov 2014)

Hallo an All! Zuerst möchte ich sagen, dass ich auf diesem Gebiet gaaanz neu bin.

Meine Apps: Netbeans (8.0.1), Apache Tomcat 

Mein Ziel: Erstellung eines Telefonbuches

Wie soll das funktionieren:
Ich habe meine Datenbank mit Daten versehen (Name, Adresse, Telefonnummer). Wenn er User eine Telefonnummer eingibt (CLIENT) -> soll die korrekte Person erscheinen mit Name und Adresse.

Hört sich eigentlich nicht so schwierig an, aber da sind schon einige wichtige Dinge drin. Ich bin außerdem neu in diesem Gebiet und würde gerne mehr lernen, indem ich dieses Beispiel löse.

Bis jetzt habe ich die Infrastruktur gemacht. Also alles erstellt, Webservice und Client Projekte in Netbeans, sowie eine Datenbank-Anbindung mit einem Connection Pool gemacht. Nun stehe ich aber an, wenn es darum geht eine richtige Webmethod für den Service zu erstellen. Ich bitte deshalb um Hilfe bzw. Gedankenanstöße. 

Wie gesagt, dass ist die herausfordernste Aufgabe (zur Zeit) für mich, ich mach das aber privat um etwas dazuzulernen. Bis jetzt habe ich einfache Webservice gemacht, wie zum Beispiel die Addition zweier Zahlen oder Hello "name", ... Damit hab ich mich mit der Infrastruktur vertraut gemacht. Dieses Beispiel ist nun schwieriger für mich und ich würde mich sehr freuen, wenn mir jemand hilft!

Vielen Dank im Voraus!

Lg Olaf


----------



## stg (30. Nov 2014)

Stell konkrete Fragen, dann kann man auch helfen. 

Viel ist ja nicht zu machen:
Nutzereingabe einlesen, Datenbankabfrage ausführen, Ausgabe an Benutzer 
Wie das nun genau realisiert wird, da gibt es zahlreiche Möglichkeiten...


----------



## Olaf777 (30. Nov 2014)

Danke schon mal für die Antwort.

Ich frage mich, wie ich die Nutzereingabe (Telefonnummer) mit den Daten der Datenbank mit Hilfe einer Webmethod abgleiche.


----------



## JavaMeister (30. Nov 2014)

Sorry, aber ...

Ist das eine konkrete Frage? - Was erwartest du hier für eine Antwort? - Fertigen Code, so dass man nicht mehr googeln oder ein Buch lesen muss? 

Und dann sehe ich oben, dass du bereits eine Addition gemacht hast.  Daher stellt sich mir die Frage, was hier anders sein soll... 

Du machst eine Methode public TelInfos getTelInfoy (String telefonnummer);

Und dann genau wie die Addition. Du lieferst ein neues Objekt mit den benötigten Informationen. 

Du hast auch schon einen ConnectionPool .Ich nehme an für eine Datenbank... JDBC COnnections? 

Dann muss man ja nur noch ein wenig SQL machen: select * from telefonnummern where telefonnumer = '" + telefonnummer + "');

Kann auch sein, dass ich die Frage nicht verstehe.


----------



## Olaf777 (30. Nov 2014)

Danke für die Gedankenanstöße und sorry für meine ungenauen Fragen...

Ich habe meine Datenbank in JDBC und in ein Connection Pool gegeben. Also in der context.xml (Resource) definiert!
Nun stell ich mir die Frage, wie ich die Datenbank in Java ansprechen kann, nachdem ich dies so eingerichtet habe. Der Name des Connection Pools lautet bei mir "connpool". Das ist mal der erste Meilenstein bei mir, dass das mal klappt, damit ich die SQL Abfragen machen kann... Danke!


----------



## Olaf777 (9. Dez 2014)

So ich hab hier was zum Zeigen.... Funktioniert aber nicht. 

Also hier mein Webservice mit Webmethode. Habe die Aufgabenstellung etwas verändert:
Also der User soll über einen Client eine Zahl eingeben -> eine Sozialversicherungsnummer (SVN). Er soll als Rückgabe den dazugehörigen Nachnamen erhalten. Alles in einer Datenbank der Tabelle "kunden" gespeichert. Felder heißen "Sozialversicherungsnummer" und "Nachname".


```
@WebMethod( operationName = "SVN-Abfrage" )
   public String svn( @WebParam( name = "Sozialversicherungsnummer" ) int SVN)
   {
      try
      {
         connection = DriverManager.getConnection( 
         DATABASE_URL, USERNAME, PASSWORD );
         statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery(
            "SELECT \"*\" FROM \"kunden\"" +
            "WHERE (\"Sozialversicherungsnummer\" = '" + SVN + 
            "')" );
         
         // Nachname soll zurückgegeben werden wenn die Sozialversicherungsnummer in der DB existiert
         while ( resultSet.next() )
         {
            return resultSet.getString("Nachname");
         } // end if

      } // end try
      catch ( SQLException e )
      {
         e.printStackTrace();
         String i= "Kann nicht gefunden werden";
         return i;
      } // end catch
      catch ( Exception e )
      {
         e.printStackTrace();  
         String i= "Kann nicht gefunden werden";
         return i;
      } // end catch
      finally
      {
         try
         {
            statement.close();
            connection.close();
         } // end try
         catch ( Exception e )
         {
            e.printStackTrace();
         String i= "Kann nicht gefunden werden";
         return i;
         } // end catch
      } // end finally
       return null;
   } // end WebMethod reserve
```

Den Webservice teste ich mit SOAP UI. Leider habe ich einen Fehler drin. Wahrscheinlich bei der "while ( resultSet.next()" Abschnitt. Wäre echt nett, wenn mir jemand helfen könnte.

Lg


----------



## Olaf777 (9. Dez 2014)

Update:


Hab meinen Code etwas angepasst:


```
@WebMethod( operationName = "SVN-Abfrage" )
   public String svn(int SVN)
   {
      try
      {
         connection = DriverManager.getConnection( 
         DATABASE_URL, USERNAME, PASSWORD );
         statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery( "SELECT Nachname FROM kunden WHERE Sozialversicherungsnummer='" + SVN +"'" );
         
         // if requested seat is available, reserve it
         if ( resultSet.next() )
         {
            return resultSet.getString("Nachname");
         } // end if
            return "fehler";
      } // end try
      catch ( SQLException e )
      {
         e.printStackTrace();
         return ("1");
      } // end catch
      catch ( Exception e )
      {
         e.printStackTrace();  
      return ("2");
      } // end catch
      finally
      {
         try
         {
            statement.close();
            connection.close();
         } // end try
         catch ( Exception e )
         {
            e.printStackTrace();
            return ("3");
         } // end catch
      } // end finally
   } // end WebMethod
```

So, hier bekomm ich ständig "3" als return. Also Exception e.... und wenn ich den finally Block entferne bekomm ich return "1". Wenn ich ebenfalls diesen entferne bekomm ich return "2". Egal was ich eintipp: Entweder eine richtige Sozialversicherungsnummer aus der DB oder irgendeine Zahl wie "123"....

Ich verstehs nicht, DB Daten sind ja alle korrekt... 

Ich will eine Zahl durch den Benutzer bekommen (INT) und gebe dafür einen dazugehörigen Nachnamen zurück (String). Viel schwerer als gedacht :-/


----------



## VfL_Freak (10. Dez 2014)

Moin,

WELCHE Exception kommen denn genau?? Sollen wir das raten?? :noe:

Poste mal den jeweiligen Stacktrace !

Gruß
Klaus


----------



## Olaf777 (10. Dez 2014)

Ich bin ein Anfänger und musste nun mal suchen wo das mitgeloggt wird von Tomcat. Habe etwas gefunden aber ich kann damit nichts anfangen. Ich hoffe ihr könnt mir helfen... Vielen Dank!





> 10-Dec-2014 20:46:37.174 SEVERE [http-nio-8080-exec-11] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/Kuranstaltwebapp] created a ThreadLocal with key of type [org.glassfish.gmbal.generic.OperationTracer$1] (value [org.glassfish.gmbal.generic.OperationTracer$1@6e9bbd66]) and a value of type [java.util.ArrayList] (value [[]]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
> 10-Dec-2014 20:46:37.174 SEVERE [http-nio-8080-exec-11] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/Kuranstaltwebapp] created a ThreadLocal with key of type [com.sun.xml.bind.v2.ClassFactory$1] (value [com.sun.xml.bind.v2.ClassFactory$1@b9eafef]) and a value of type [java.util.WeakHashMap] (value [{class com.sun.xml.ws.runtime.config.MetroConfig=java.lang.ref.WeakReference@59981743, class com.sun.xml.ws.runtime.config.TubelineDefinition=java.lang.ref.WeakReference@7442991a, class com.sun.xml.ws.runtime.config.TubeFactoryList=java.lang.ref.WeakReference@47817a79, class javax.xml.bind.annotation.adapters.CollapsedStringAdapter=java.lang.ref.WeakReference@391e44b1, class com.sun.xml.ws.runtime.config.TubeFactoryConfig=java.lang.ref.WeakReference@20a56ede, class java.util.ArrayList=java.lang.ref.WeakReference@40cfb999, class com.sun.xml.ws.runtime.config.Tubelines=java.lang.ref.WeakReference@cd1514b, class javax.xml.bind.annotation.W3CDomHandler=java.lang.ref.WeakReference@4721a7ac}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
> 10-Dec-2014 20:46:37.174 SEVERE [http-nio-8080-exec-11] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/Kuranstaltwebapp] created a ThreadLocal with key of type [com.sun.xml.bind.v2.runtime.Coordinator$1] (value [com.sun.xml.bind.v2.runtime.Coordinator$1@4c79f208]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@7147896f]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
> 10-Dec-2014 20:46:37.174 SEVERE [http-nio-8080-exec-11] org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks The web application [/Kuranstaltwebapp] created a ThreadLocal with key of type [org.glassfish.gmbal.generic.OperationTracer$1] (value [org.glassfish.gmbal.generic.OperationTracer$1@6e9bbd66]) and a value of type [java.util.ArrayList] (value [[]]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
> ...


----------



## Olaf777 (10. Dez 2014)

Update: Habe nun ein neues Projekt gemacht und habe das ganze OHNE Webservice versucht. Ergebnis: Es hat geklappt und ich hab seit Langem ein Erfolgserlebnis 
Hier ein Screen: http://www.youscreen.de/wutlkxgz18.jpg

Nun will ich das ganze in den Webservice bekommen. Vielleicht sieht jemand etwas, was ich ändern muss, damit es funktioniert? Ich seh es nicht wirklich..... Vielen Dank im Voraus und Danke für die bisherige Hilfe!

Lg


----------



## Olaf777 (11. Dez 2014)

Update2:
Mein Webservice schaut nun so aus:


```
@WebService
public class KuranstaltWS {

     static final String DATABASE_URL = "jdbc:mysql://X.X.X.X.X:XXXX/XXX";
     static final String USERNAME = "XXX";
     static final String PASSWORD = "XXX";
     Connection connection;

    @WebMethod( operationName = "SVN-Abfrage" )
   public String svn(int SVN)
   {
        try {
            connection = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);

            String query = "SELECT Nachname FROM kunden WHERE Sozialversicherungsnummer=" + SVN;
            PreparedStatement stmnt = connection.prepareStatement(query);
            ResultSet resultSet = stmnt.executeQuery();
            
            if (resultSet.next()) {
                return resultSet.getString(1);
            } 
            
        } 
        catch (SQLException ex) {
            Logger.getLogger(KuranstaltWS.class.getName()).log(Level.SEVERE, null, ex);
        }
         return "Error!";     
    }
}
```

Hier als Bild:


Und hier das Bild zu SOAP UI, als ich getestet habe (Rückgabe: "Error!"):



Im Moment weiß ich nicht weiter... Vllt kann mir we helfen! DANKE!

Lg


----------

