2011-07-12 5 views
3

J'essaie d'utiliser MongoDB avec Morphia comme ma base de données back-end, j'ai implémenté une classe utilitaire pour simplifier l'accès à la base de données. Je fonction utilisateur implémenté add base avec Cependant, je reçois `beaucoup d'exceptions:Comment utiliser Morphia avec Java/GWT

java.lang.IndexOutOfBoundsException exception quand je mets

query = datastore.createQuery (User.class) .filter ("name =", nom d'utilisateur);

pour vérifier l'utilisateur avant de procéder.

une fois enlevé: je reçois ces deux exceptions:

java.lang.RuntimeException: java.lang.NumberFormatException: 

Comment résoudre ce problème?

Voici le code que j'ai pour le projet:

MorphiaUtil.java:

public class MorphiaUtil { 

    protected final Log log = LogFactory.getLog(getClass()); 
    private static Mongo mongo; 
    private static Datastore datastore; 

    static { 
     try { 
      // Create the database connection 
      mongo = new Mongo("localhost"); 
      datastore = new Morphia().createDatastore(mongo, "mygwtapp"); 
     } catch (UnknownHostException e) { 
      System.err.println("Caught Unknown host exception:"+e); 
      e.printStackTrace(); 
     } catch (MongoException e) { 
      System.err.println("Initial Datastore creation failed:"+e); 
      e.printStackTrace(); 
     } 
    } 

    public static Datastore getDatastore() { 
     return datastore; 
    } 
} 

UserServiceImpl.java

public class UserServiceImpl extends RemoteServiceServlet 
    implements UserService { 
    @Override 
    public void addUser(String username, String password) 
      throws IllegalArgumentException { 
     try { 
      Datastore datastore = MorphiaUtil.getDatastore(); 
      Query query = datastore.createQuery(User.class).filter("name = ", username); 
      User user = (User) query.asList().get(0); 
      if (user == null) { 
       user = new User(username, password); 
       datastore.save(user); 
      } 

     } catch (Exception e) { 
      System.err.print("Caught exception:"+e); 
     } 
    } 
} 
+0

Donnez-nous les traces de pile des deux exceptions. –

+0

Quelle ligne provoque l'exception? –

Répondre

2

J'ai créé une version serveur de tous mes haricots, et Avant d'appeler les méthodes d'enregistrement, je convertis les simples haricots (utilisés côté client) en MorphiaBeans (utilisé uniquement pour les opérations morphiques). Ce n'est pas la meilleure méthode pour résoudre ce problème, mais ça marche bien pour moi!

+0

Salut, pouvez-vous partager plus sur votre solution? – xybrek

+1

J'ai fait une copie de mon haricot simple, côté serveur. Cette copie a toutes les annotations de morphia, a un objectId à (c'est la classe non sérialisable qui ne fonctionne pas dans le client gwt). Je remplace la méthode save dans mon DAO, et dans la méthode save je passe un SimpleBean, puis je le convertis en MorphiaBean (le bean morphia reçoit en construtor un Simple Bean), et j'ai fait l'opération. Si l'opération nécessite un retour (find), je convertis à nouveau en SimpleBean (la morphia ne renvoie que morphiaBean, dans ce cas). Encore une fois, ce n'est probablement pas la bonne façon de faire, mais cela fonctionne. :) –

+0

La solution @ raduq-santos fonctionne bien. Rappelez-vous, si vous voulez utiliser une classe dans le client gwt, elle doit être sérialisable, car gwt la "convertit" en JS. Donc, les annotations de morphes ne sont pas sérialisables pour gwt, donc, vous avez besoin de quelque chose comme un pattern DTO/VO. Les beans complexes du coté serveur, les beans simples en shared. – caarlos0

Questions connexes