2015-10-13 3 views
3

Я пытаюсь отправить форму на сервер Restore ServerResource и прочитать его в объекте, используя Gson Restlet Extension.Использование Gson для Restlet для преобразования данных Post (представление) в объект

Есть no documentation о том, как его использовать и ничего не использовать в StackOverflow.

Каков правильный способ использования расширения gson restlet?

Ниже то, что я пытался до сих пор:

public class CustomerSegment { 
    private int visitsMin; 
    private int visitsMax; 
    // Getters, Setters and constructors 
} 

public class CampaignsResource extends ServerResource { 
    @Post 
    public Representation createCampaign(Representation entity) { 
     Form form = new Form(entity); 
     // Using form is the usual way, which works fine 
     // form: [[visitsMin=3], [visitsMax=6]] 

     CustomerSegment segment = null; 
     // Following hasn't worked 
     GsonConverter converter = new GsonConverter(); 
     try { 
      segment = converter.toObject(entity, CustomerSegment.class, this); 
      //segment = null 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     GsonRepresentation<CustomerSegment> gson 
     = new GsonRepresentation<CustomerSegment>(entity, CustomerSegment.class); 
     try { 
      segment = gson.getObject(); 
      //NullPointerException 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return new EmptyRepresentation(); 
    } 
} 

формы данные, которые размещены: Form Post Data

ответ

3

В самом деле, вы можете использовать встроенный в конвертер поддержки 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

+0

Вы абсолютно правы. Я тоже изменил его на 'createCampaign (сегмент CustomerSegment)', и он начал работать нормально. Поэтому мне было интересно, что здесь с Гсоном. Теперь, если я удаляю расширение Gson из файла pom, я получаю 415 неподдерживаемую ошибку Media при публикации json. Итак, под капотом происходит какая-то маска-револьвер-гс, которая преобразует опубликованные данные в Bean. – ntsh

+1

Фактически, каждый конвертер поддерживает только набор типов носителей. Например, при получении контента в запросе движок определяет, какой преобразователь использовать в соответствии с типом контента. То же самое происходит при отправке содержимого, но в этом случае он полагается на заголовок 'Accept', если он есть. Поскольку по умолчанию нет конвертера, который знает, как обрабатывать JSON, если вы удаляете конвертер Gson, конвертер не может быть найден для обработки содержимого ответа, поэтому возвращается код статуса 415. –