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.