2012-11-08 5 views
0

J'ai un servelet qui peut recevoir une requête d'un service de repos ou d'un message de formulaire jsp qui appelle une méthode interne (internalAddPodcast()) pour ajouter une entité au magasin de données.datatore.put() ne pas ajouter à db?

Lorsque je clique sur internalAddPodcast() à partir de la page jsp, cela fonctionne très bien, je peux voir que l'entité a été ajoutée avec succès en l'interrogeant juste après l'ajout. MAIS quand je le fais de la méthode de repos addPodcast() le datastore.put() ne semble pas être en train d'ajouter réellement au datastore, parce que j'essaye de le récupérer juste après put() et rien ne revient. Regardez vers le bas de cette classe où j'ai mis le commentaire "// CETTE QUESTION EST VIDE LORSQU'ELLE EST AJOUTÉE DU SERVICE DE REPOS :(" C'est là que je m'attends à voir des résultats revenir, surtout l'entité que je viens de magasin de données.

package com.aol.sharepodder; 

import java.io.IOException; 
import java.util.Date; 
import java.util.List; 
import java.util.logging.Logger; 

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.DefaultValue; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

import com.google.appengine.api.datastore.DatastoreService; 
import com.google.appengine.api.datastore.DatastoreServiceFactory; 
import com.google.appengine.api.datastore.Entity; 
import com.google.appengine.api.datastore.FetchOptions; 
import com.google.appengine.api.datastore.KeyFactory; 
import com.google.appengine.api.datastore.PreparedQuery; 
import com.google.appengine.api.datastore.Query; 
import com.google.appengine.api.users.User; 
import com.google.appengine.api.users.UserService; 
import com.google.appengine.api.users.UserServiceFactory; 

@Path("/add/podcast/") 
public class AddPodcastServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 
    private static final Logger log = Logger.getLogger(AddPodcastServlet.class 
      .getName()); 

    public void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 

     String email = req.getParameter("email"); 
     String collectionName = req.getParameter("collectionName"); 
     String podcast_url = req.getParameter("podcast_url"); 
     String podcast_description = req.getParameter("podcast_description"); 
     String podcast_title = req.getParameter("podcast_title"); 

     log.info("--post adding " + collectionName); 

     internalAddPodcast(email, collectionName, podcast_url, 
       podcast_description, podcast_title); 

     resp.sendRedirect("/collection_details.jsp?collectionName=" 
       + collectionName + "&email=" + email); 
    } 

    @POST 
    @Produces("text/plain") 
    @Consumes("application/x-www-form-urlencoded") 
    public String addPodcast(
      @DefaultValue("[email protected]") @FormParam("email") String email, 
      @DefaultValue("default") @FormParam("collectionName") String collectionName, 
      @DefaultValue("") @FormParam("podcast_url") String podcast_url, 
      @DefaultValue("") @FormParam("podcast_description") String podcast_description, 
      @DefaultValue("") @FormParam("podcast_title") String podcast_title) { 
     try { 
      internalAddPodcast(email, collectionName, podcast_url, 
        podcast_description, podcast_title); 
      if (podcast_url == "") { 
       return "No url supplied"; 
      } 
      return "true"; 
     } catch (Exception e) { 
      return e.getMessage(); 
     } 
    } 

    private void internalAddPodcast(String email, String collectionName, 
      String podcast_url, String podcast_description, String podcast_title) { 
     log.info("--INTERNAL ADD "); 
     log.info("--email " + email); 
     log.info("--collectionName " + collectionName); 
     log.info("--podcast_url " + podcast_url); 
     log.info("--podcast_description " + podcast_description); 
     log.info("--podcast_title " + podcast_title); 

     UserService userService = UserServiceFactory.getUserService(); 
     User user = userService.getCurrentUser(); 

     Entity podcast = new Entity("Podcast"); 
     podcast.setProperty("collectionName", collectionName); 
     podcast.setProperty("user", user); 
     podcast.setProperty("email", email); 
     Date date = new Date(); 
     podcast.setProperty("date", date); 
     podcast.setProperty("podcast_title", podcast_title); 
     podcast.setProperty("podcast_description", podcast_description); 
     podcast.setProperty("podcast_url", podcast_url); 

     DatastoreService datastore = DatastoreServiceFactory 
       .getDatastoreService(); 
     datastore.put(podcast); 

     //try to log the podcast that I just got done adding to the datastore 
     Query query = new Query("Podcast"); 
     PreparedQuery pq = datastore.prepare(query); 

      //THIS QUERY IS EMPTY WHEN ADDED FROM THE REST SERVICE :(
     for (Entity p : pq.asIterable()) { 
      log.info("_loop " + " - " + KeyFactory.keyToString(p.getKey()) 
        + " -- " + p.getProperty("podcast_title") + " - " 
        + p.getProperty("podcast_url")); 
     } 
    } 
} 

Toutes les idées que je fais mal, et pourquoi l'entité que je suis en train d'ajouter de la méthode de repos ne reçoit pas ajouté à la banque de données.

Je sais que Dans les deux cas, (soit à partir de la publication jsp, soit du service de repos), lorsque j'arrive à internalAddPodcast(), tous les paramètres de la méthode arrivent correctement

Répondre

1

Ah HA! Je l'ai trouvé. Je ne consignais pas l'exception qui était lancée. Fondamentalement, j'essayais de stocker une propriété de chaîne de plus de 500 caractères et elle émettait une exception à laquelle je devais faire attention :) Donc, elle n'atteignait jamais le datastore.put()

+3

C'est pourquoi vous ne devriez jamais avoir un 'try/catch (Exception e)' autour de votre code. –

+0

D'accord. Merci Nick. –

2

Le magasin de données de plication est finalement cohérent. Cela signifie que la plupart des requêtes ne sont pas garanties pour refléter les modifications qui viennent d'être apportées au magasin de données, y compris les enregistrements que vous venez d'insérer. En savoir plus à ce sujet et comment faire des requêtes fortement cohérentes here.

+0

merci pour votre commentaire! J'ai trouvé le problème, comme indiqué ci-dessus. :) J'ai aussi augmenté votre commentaire :) –

Questions connexes