# Server schickt immer null-Wert



## Goldfish (6. Aug 2011)

Hey, ich hab mal wieder ein schönes Problem mit meinem netzwerk. Und zwar, habe ich eine Request-Klasse, die eine Map mit Serializable Parametern erhält. Diese Map befülle ich und schicke diese an den Server. Dieser identifiziert die Request und kreiert eine neue mit neuen Parametern und schickt diese zurück an den Client. Allerdings erhält der Client, wenn ich das mache immer eine null-Instanz. 

[Java=42]
import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class Request implements Serializable {
    private static final long serialVersionUID = 2208321882854260740L;

    //! Gets the Type of this Request
    private final RequestType               type;
    //! Gets the parameters of this request
    private final Map<String, Serializable> params;

    public Request(RequestType type) {
      this.type = type;
      this.params = new HashMap<String, Serializable>();
    }

.... // Das ist im Prinzip die Request Klasse und im Folgenden beim Server:

public void identifyRequest(Request r){
    switch(r.getType()){
      case LOGIN           
        ns.sendMessage(Classroom.sql.getUserInstance( (String)r.get(RequestKey.USERNAME),
                                                                               (String)r.get(RequestKey.PASSWORD) ));
        break;
      case REGISTER:
        ns.sendMessage(Classroom.sql.register ( (String)r.get(RequestKey.USERNAME),
                                          (String)r.get(RequestKey.PASSWORD) ) );
        break;
    }

// Hier ist schonmal der lustige Teil, dass es bei dem REGISTER funktioniert, nur beim LOGIN nicht...

// aus der SQL-Klasse
public synchronized static Request getUserInstance(String name, String password){
    Request rt = new Request(RequestType.LOGIN);
    ResultSet result;
    User user = null;
    try{
      result = stmt.executeQuery( "Select * from User where name = '"+name+"'");
      if(result.next()){
        if( !password.equals( result.getString(4) ) ){
          rt.set(RequestKey.ACCEPT,false);
          String error = "The password was not correct, please try again";
          rt.set(RequestKey.ERRORMESSAGE,error);
        }else{
          rt.set(RequestKey.ACCEPT,true);
          user = new User( result.getLong(1), // the user ID
                           result.getLong(3), // the points of this user
                           result.getString(2), // the userName
                           result.getString(5), // the real name of this user
                           result.getString(6), // the email
                           result.getString(7), // the country
                           result.getString(8)  // the comments
                          );
        }
      }else{
        rt.set(RequestKey.ACCEPT,false);
        String error = "A user with this name does not exist!";
        rt.set(RequestKey.ERRORMESSAGE,error);
      }
    }catch(SQLException ex){ JOptionPane.showMessageDialog( new JFrame(),
                             ex.getMessage());   }
    rt.set(RequestKey.USER,user);
    return rt;
  }

[/code]

Also gibt die Funktion eine einfache Request mit den gewünschten Paramtern zurück. Ich hab auch schon Testausgaben gemacht vor dem case LOGIN           
        ns.sendMessage(Classroom.sql.getUserInstance( (String)r.get(RequestKey.USERNAME),
                                                                               (String)r.get(RequestKey.PASSWORD) ));
        break;
indem ich die Request erst in eine entsprechende Instanz gepackt habe und dann abgefragt habe, ob auch alle Werte, die ich aben will drinnen sind, was sie waren. Erst wenn es beim Client ankommt, ist das ganze plötzlich null... hat jemand ne Idee?


EDIT: Ich habe gerade festgestellt, dass es an der User Instanz liegen muss. Wenn ich diese nicht mit in die Request setze, funktioniert es. Allerdings finde ich das etwas seltsam, und ich möchte nur ungern immer nur die primitiven senden... weiß jemand woran das liegt und was man dagegen machenn kann?


----------



## tagedieb (7. Aug 2011)

Goldfish hat gesagt.:


> Erst wenn es beim Client ankommt, ist das ganze plötzlich null... hat jemand ne Idee?



Was meinst du mit "das ganze"? Das "Request" Object? Die Map?
Welches Netzwerk-Protokol verwendest du? Sockets, RMI,...?


Schwierig den Fehler zu finden ohne zu wissen wie die Datenuebertragung funktioniert, welche Daten geschickt und was genau empfangen wird.

Auf ein Schuss ins Blaue wuerd ich sagen es handelt sich um ein Serialisierungsfehler und die Exception wird irgendwo geschluckt und stattdessen "null" zurueckgeliefert. Ist das "User" Klasse auch im Client-Classpath, verwendest du die gleiche version wie im Server?


----------



## Goldfish (7. Aug 2011)

Okay, sorry dass ich so unklar gewesen bin.
Es befindet sich alles im Classpath. Verwenden tue ich den ObjectOutput- und InputStream Und die Request selbst ist das Objekt, das plötzlich null ist. In der Map sammel ich ja verschiedene Serialisierungsobjekte. Und sobald ich den User in die Map mit hineingebe und es dann über den Outputstream an den Client schicke, ist die Request selbst auf einmal null.

Also für mich ein absolutes Rätsel...


----------



## bERt0r (7. Aug 2011)

Schuss ins Blaue: Ist der User Serializeable? Wenn ja, kannst du verrsuchen readObject und writeObject zu Überschreiben.


----------



## tagedieb (7. Aug 2011)

Kannst du mal den Code posten? Vorallem der Teil zum Senden und Lesen der Streams.


----------



## Goldfish (7. Aug 2011)

Hat sich erledigt. Es klappt jetzt, wo ich die Klasse User für den Server in ein gleichnamiges Package verfrachtet habe, wie es auf der Client-Seite der Fall ist.
Also die Klasse User befindet sich bei mir im package prog.dataTypes; Da der Server diese Klasse jetzt nicht in einem gleichnamigen Package hatte, kam es wohl irgendwie zu dem Problem. Jetzt geht es.

Sonst danke soweit.


----------

