2015-06-20 20 views
6

Sto lavorando a un'applicazione GWT che cerca i file su server diversi. Ho il mio codice di ricerca nel pacchetto server in una classe chiamata Cerca. Per aiutare la ricerca a localizzare i server, ho le posizioni dei server in una classe chiamata Login, che si trova nel pacchetto condiviso. Il login contiene oggetti di autenticazione, che memorizzano le informazioni per un singolo server.GWT - Impossibile ottenere la firma del tipo per la classe

Il codice per chiamare Search è la seguente:

SearchInterfaceAsync search = GWT.create(SearchInterface.class); 
AsyncCallback<Void> callback = new AsyncCallback<Void>() { 
    @Override 
    public void onFailure(Throwable caught) { 
     System.out.println("Error: " + caught.getMessage()); 
    } 
    @Override 
    public void onSuccess (Void results) { 
     System.out.println("Success!"); 
    } 
}; 

search.initialize(serverName, login, callback); 
search.searchServers(search, variousSearchParameters, callback); 

Quando eseguo il programma e provare a cercare, il programma stampa Error: could not get type signature for class [Lcom.example.test.shared.Authentication;.

Il codice di autenticazione è il seguente:

public class Authentication implements Serializable { 

    private static final long serialVersionUID = 5326256122438445301L; 

    private String server; 
    private String userName; 
    private String password; 

    public Authentication(String serverName){ 
     server = serverName; 
    } 

    public Authentication(String serverName, String user, String pass){ 
     server = serverName; 
     userName = user; 
     password = pass; 
    } 

    public String getServer(){ 
     return server; 
    } 

    public String getUserName(){ 
     return userName; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

Ho provato a cambiare il tipo di dichiarazione, aggiungendo serializzazione, il passaggio a IsSerializible, e non funziona niente!

risposta

8

Ho provato a cambiare la dichiarazione del tipo, aggiungendo la serializzazione, passando a IsSerializible e niente funziona!

Ne hai perso uno: devi avere un costruttore predefinito (zero-arg), oppure non è possibile creare una nuova istanza. Il processo di deserializzazione crea un oggetto quindi assegna i campi.

Credo che si possa proteggere questo costruttore in modo che nessuno sviluppatore possa accidentalmente usarlo.

+2

Penso che si possa addirittura renderlo "privato". –

5

Nel caso in cui aiuti gli altri, queste sono le cause di questo errore che ho riscontrato di recente. Invio di oggetti dal client al server:

  1. mancante no-args costruttore public MyObject() {}
  2. Avere una variabile membro definito come Object (oggetto non può essere serializzato)
  3. Dimenticando per l'attuazione del Serializable interfaccia
  4. Utilizzando Generici in cui il tipo non è determinato (penso che sia stato <?> a causare problemi).
  5. Avere la "versione" errata di una classe "standard" importata. Ad esempio un "elenco" estraneo importato invece di java.util.List.
  6. Avere una variabile membro di tipo java.io.Serializable. La variabile membro potrebbe trasportare ok-server-cliente, ma il rinvio fallito. Risolto il membro è stato avvolto da una classe GWT sulla strada che non era serializzabile ("ServerSerializationStreamReader $ BoundedList").
  7. Avere un oggetto secondario (variabile membro) con uno di questi problemi sopra.

Questi errori in GWT possono apparire come "500 errori del server" che è difficile eseguire il debug.

Spero che si risparmia un po 'di capelli.

+2

8. Pulire e ricompilare – robert

0

Il mio problema era un'interfaccia flag "IsSerializable" mancante nella classe indicata nell'errore.

Problemi correlati