我理解Play如何将URI段或参数绑定到操作方法参数。我还看到了如何访问上传的文件。
但我仍然在寻找将PUT或POST请求的请求实体绑定到方法参数的方法。
假设请求类似于
PUT /blog/entries/67
Content-Type: application/atom+xml
<entry>...</entry>
我想将它绑定到一个入口参数:
public static void (String entryId, Entry entry) {
// entryId being 67
// entry being the deserialized Atom payload (e.g. using Apache Abdera parser)
backend.updateEntry(67,entry);
// AtomPub's 'canonical' response is the updated entry.
render(entry)
}
两个问题:
这样的事情有用吗?
在哪里可以找到有关如何创建反序列化器的文档?
答案 0 :(得分:1)
查看Play网站上的自定义绑定文档。
http://www.playframework.org/documentation/1.2.3/controllers#custombinding
我认为您正在寻找的是play.data.binding.TypeBinder
,它允许您自定义Play绑定控制器中某些对象的方式。
<强>更新强>
查看游戏组,Guillaume发布了以下用于在POST主体中处理JSON的代码,因此可以轻松地对其进行调整以从atom + xml输入中获取XML。它使用BinderPlugin而不是TypeBinder,它允许您进行更多pwerful绑定操作。
package plugins;
import play.*;
import play.mvc.*;
import com.google.gson.*;
import java.util.*;
import java.lang.reflect.*;
import java.lang.annotation.*;
public class BinderPlugin extends PlayPlugin {
public Object bind(String name, Class clazz, Type type, Annotation[] annotations, Map<String, String[]> params) {
if(Http.Request.current().contentType.equals("application/json")) {
JsonObject json = new JsonParser().parse(Scope.Params.current().get("body")).getAsJsonObject();
if(clazz.equals(String.class)) {
return json.getAsJsonPrimitive(name).getAsString();
}
}
return null;
}
}