Как Errai может сериализовать / десериализовать объекты модели
Я пытаюсь использовать возможности отдыха Errai в моем приложении GWT,
Я взглянул на следующее руководство:
http://errai-blog.blogspot.it/2011/10/jax-rs-in-gwt-with-errai.html
В частности, это говорит:
Мы просто помещаем этот интерфейс где-то в наших клиентских пакетах (например, client.shared), где его может найти компилятор GWT. Чтобы создать запрос, все, что нужно сделать, это вызвать RestClient.create()
Я думаю, что здесь есть пробел в сюжете, как Эррай может узнать, как сериализовать / десериализовать классы моделей?
Вы можете помочь понять это?
Спасибо
1 ответ
В соответствии с RestClient
Метод create() класса
public static <T, R> T create(final Class<T> remoteService, final RemoteCallback<R> callback, Integer... successCodes) {
return create(remoteService, null, callback, null, successCodes);
}
В примере, который вы предоставили; при использовании метода create() Errai получает класс CustomerService как remoteService
После многих операций;
Errai анализирует и реализует этот интерфейс CustomerService с помощью своей библиотеки errai-codegen, которая использует Java Reflection API.
При разборе просто;
Сначала он ищет аннотированные методы JAX-RS и определяет их как JaxrsResourceMethod
Затем он изучает параметры этого метода, если есть какой-либо параметр, аннотированный аннотациями JAX-RS.
Если он находит аннотированные параметры в JaxrsResourceMethod, он сохраняет этот параметр со своим типом аннотации
Если он находит не аннотированный параметр в JaxrsResourceMethod, он определяет его как entityParameter
Errai хранит эти аннотированные параметры и entityParameters в JaxrsResourceMethodParameters по их методу. При построении запроса он использует параметры по их правилу.
Позвольте мне объяснить эти правила на примере, который вы предоставили.
Customer customer = new Customer("new name", "new last name", "new postal code");
RestClient.create(CustomerService.class, callback).updateCustomer(240193, customer);
Errai создаст URL как
example.com/cusomers/240193
Потому что правило аннотации @PathParam("id") добавляет параметр в URL и в соответствии с правилом entityParameter от Errai. customer
будет маршалироваться при отправке данных с PUT.
@PUT
@Path("/{id}")
@Consumes("application/json")
@Produces("application/json")
public Customer updateCustomer(@PathParam("id") long id, Customer customer); //- See more at: http://errai-blog.blogspot.com.tr/2011/10/jax-rs-in-gwt-with-errai.html#sthash.2GTQtIg8.dpuf
Еще одно дополнительное замечание, если вы проверите здесь, есть исключение в методе setEntityParameter;
Для каждого метода допускается только один параметр без аннотации объекта:
Это означает, что вы не можете определить методы с более чем 1 аннотированным параметром в классе, который вы отправили в Errai.