В самом деле, вы можете использовать встроенный в конвертер поддержки Restlet без явного использования gson converter.
Фактически, когда вы помещаете расширение GSON в путь класса, содержащийся в нем конвертер автоматически регистрируется в самом процессоре Restlet. Для того, чтобы убедиться, что вы можете просто использовать эти строки при запуске приложения:
List<ConverterHelper> converters
= Engine.getInstance().getRegisteredConverters();
for (ConverterHelper converterHelper : converters) {
System.out.println("- " + converterHelper);
}
/* This will print this in your case:
- [email protected]
- [email protected]
- [email protected]
*/
Тогда вы можете рассчитывать на бобах в сигнатурах методов в ваших серверных ресурсах вместо класса представления, как описано ниже:
public class MyServerResource extends ServerResource {
@Post
public SomeOutputBean handleBean(SomeInputBean input) {
(...)
SomeOutputBean bean = new SomeOutputBean();
bean.setId(10);
bean.setName("some name");
return bean;
}
}
Это работает в обе стороны:
- десериализация содержания запроса в бобе, который передается в качестве параметра метода обработки в ресурсе сервера.
- Сериализация в виде ответа возвращаемого компонента.
Вам больше нечего делать здесь.
Для клиентской стороны вы можете использовать один и тот же механизм. Он основан на аннотированных интерфейсах. Для этого вам необходимо создать интерфейс, определяющий, что можно вызвать на ресурсе. Для нашего предыдущего примера, это будет что-то вроде этого:
public interface MyResource {
@Post
SomeOutputBean handleBean(SomeInputBean input);
}
Затем вы можете использовать его с клиентским ресурсом, как описано ниже:
String url = "http://localhost:8182/test";
ClientResource cr = new ClientResource(url);
MyResource resource = cr.wrap(MyResource.class);
SomeInputBean input = new SomeInputBean();
SomeOutputBean output = resource.handleBean(input);
Так что в вашем случае, я бы реорганизовать код как описано ниже:
public class CampaignsResource extends ServerResource {
private String getUri() {
Reference resourceRef = getRequest().getResourceRef();
return resourceRef.toString();
}
@Post
public void createCampaign(CustomerSegment segment) {
// Handle segment
(...)
// You can return something if the client expects
// to have something returned
// For creation on POST method, returning a 204 status
// code with a Location header is enough...
getResponse().setLocationRef(getUri() + addedSegmentId);
}
}
Вы можете использовать, например, тип application/json
контента для передачи данных в формате JSON:
{
visitsMin: 2,
visitsMax: 11
}
Если вы хотите использовать Gson, вы должны использовать этот тип контента вместо urlencoded один, так как инструмент нацелен на преобразование JSON:
Gson представляет собой библиотеку Java, которая может быть использована для преобразования объектов Java в их JSON представления. Его также можно использовать для преобразования строки JSON в эквивалентный объект Java.Gson может работать с произвольными объектами Java , включая ранее существовавшие объекты, у которых нет исходного кода.
Надежда это помогает вам, Thierry
Вы абсолютно правы. Я тоже изменил его на 'createCampaign (сегмент CustomerSegment)', и он начал работать нормально. Поэтому мне было интересно, что здесь с Гсоном. Теперь, если я удаляю расширение Gson из файла pom, я получаю 415 неподдерживаемую ошибку Media при публикации json. Итак, под капотом происходит какая-то маска-револьвер-гс, которая преобразует опубликованные данные в Bean. – ntsh
Фактически, каждый конвертер поддерживает только набор типов носителей. Например, при получении контента в запросе движок определяет, какой преобразователь использовать в соответствии с типом контента. То же самое происходит при отправке содержимого, но в этом случае он полагается на заголовок 'Accept', если он есть. Поскольку по умолчанию нет конвертера, который знает, как обрабатывать JSON, если вы удаляете конвертер Gson, конвертер не может быть найден для обработки содержимого ответа, поэтому возвращается код статуса 415. –