2011-12-19 5 views
0

J'utilise explicitement un TypeBinder avec le mot-clé @As dans mon action de contrôleur. Et peu importe ce que je fais, la méthode bind n'est jamais appelée.Classeur personnalisé ne fonctionne pas dans PlayFramework

Qu'est-ce qui détermine le liant utilisé? J'ai également tourné ma journalisation à ALL et j'ai réalisé que Binder.bindInternal n'est jamais appelé non plus.

ici est mon classeur

public class EmailTypeBinder implements TypeBinder<Email> { 

    @Override 
    public Email bind(String name, Annotation[] annotations, String value, Class actualClass, Type genericType) throws Exception { 
     System.out.println("Inside email type binder"); 
     return new Gson().fromJson(value, Email.class);  
    } 

} 

Voici l'action du contrôleur

public static void send(@As(binder=EmailTypeBinder.class) Email email) { 
     try { 
     for(String key1:DataParser.parsers.keySet()) { 
      System.out.println("Key: " + key1 + " value: " + DataParser.parsers.get(key1).getClass().getName()); 
     } 

     for(String key : params.all().keySet()) { 
      System.out.println("Key: " + key + " value: " + params.get(key)); 
     } 

     System.out.println("ContentType: " + request.contentType); 
     if(request.body == null) { 
      System.out.println("request.body is null"); 
     } 

     System.out.println("Available bytes: " + request.body.available()); 

     InputStreamReader reader = new InputStreamReader(request.body); 
     String str; 

     BufferedReader br = new BufferedReader(reader); 
     while ((str = br.readLine()) != null) { 
      System.out.println("You entered String : " + str); 
     } 

     if(email == null) { 
      System.out.println("email is null"); 
     } else { 
      System.out.println(email.getMessage()); 
     } 

    }catch(Exception e) { 
     e.printStackTrace(); 
    } 

Voici la réponse d'appeler le contrôleur

Key: application/xml value: play.data.parsing.TextParser 
Key: multipart/form-data value: play.data.parsing.ApacheMultipartParser 
Key: application/json value: play.data.parsing.TextParser 
Key: application/x-www-form-urlencoded value: play.data.parsing.UrlEncodedParser 
Key: body value: {email:{"from":"","subject":"Test Posted Subject","message":"This is my POSTED message","groups":[],"groupLists":["COS"]}} 
ContentType: application/json 
Available bytes: 0 
email is null 

Dans mes itinéraires je

POST /send         Application.send 

Le client est réellement Groovy mais cela ne devrait pas importer parce que j'ai également essayé de faire un modèle, juste un objet régulier dans ce projet. Quoi qu'il en soit, vous pouvez penser à

public static void post(Email email) { 

    def http = new HTTPBuilder('http://localhost:9000') 

    // perform a GET request, expecting JSON response data 
    http.request(POST, ContentType.JSON) { req -> 
     uri.path = '/send' 

     body = "{email:" + new Gson().toJson(email) + "}"; 


     // response handler for a success response code: 
     response.success = { resp, json -> 
      println "status: ${resp.statusLine}" 

      // parse the JSON response object: 
      println " ${json}" 
     } 

     // handler for any failure status code: 
     response.failure = { resp -> 
     println "Unexpected error: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}" 
     } 
    } 
} 

Voici ma classe Email mais je ne suis pas sûr de sa pertinente

class Email implements Serializable { 

// factory methods 
public static Email createSimple(String subject, String message) { 
    return new Email("", subject, message); 
} 
public static Email create(String from, String subject, String message) { 
    return new Email(from, subject, message);  
} 

public static Email createWithTemplate(String from, String subject, String message, String template) { 
    Email email = new Email(from, subject, message); 
    email.setTemplate(template); 
    return email; 
} 


public String getFrom() { 
    return from;   
} 

public String getSubject() { 
    return subject; 
} 

public String getMessage() { 
    return message; 
} 

public Set<String> getGroupLists() { 
    return groupLists; 
} 

public Set<String> getGroups() { 
    return groups; 
} 

public void addGroupList(String groupList) { 
    groupLists.add(groupList); 
} 
public void addGroup(String group) { 
    groups.add(group); 
} 

private void setTemplate(String template) { 
    this.template = template; 
} 

// we must use the factory methods to create us 
private Email(String from, String subject, String message){ 
    this.from = from; 
    this.subject = subject; 
    this.message = message; 
} 

// only used for Gson JSON serialization/deserialization 
public Email(){} 

private String from; 
private String subject; 
private String message; 
private String template; 
private Set<String> groups = new HashSet<String>(); 
private Set<String> groupLists = new HashSet<String>(); 

}

La seule façon que je peux obtenir ce travail utilise le ApiPlugin de Chapitre 4 exemple dans le livre de recettes Play Framework Je peux l'utiliser mais le framework dit qu'il devrait pouvoir le gérer simplement en définissant un TypeBinder mais ce n'est pas le cas.

Répondre

0

Il semble que vous donniez votre objet e-mail en tant qu'objet json mais que les classeurs fonctionnent sur les paramètres de formulaire. Essayez de donner votre objet sous forme de param ou utilisez gson en jeu pour désérialiser l'objet

Questions connexes