Как привязать тело запроса к параметру метода действия? - PullRequest
2 голосов
/ 05 октября 2011

Я понимаю, как 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) 

}

Два вопроса:

Работает ли что-то подобное?

Где найти документацию по созданию десериализатора?

1 Ответ

1 голос
/ 05 октября 2011

Посмотрите документацию Custom Binding на сайте Play.

http://www.playframework.org/documentation/1.2.3/controllers#custombinding

Я думаю, что вы ищете play.data.binding.TypeBinder, который позволяет вам настроить способ, которым Play связывает определенные объекты в вашем контроллере.

Обновление:

Рассматривая игровые группы, Гийом опубликовал следующий код для обработки JSON в теле POST, поэтому его можно легко адаптировать для получения XML из входных данных atom + xml. Он использует BinderPlugin, а не TypeBinder, что позволяет вам выполнять более веселые операции связывания.

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;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...