Главная » Spring » Изменение ресурсов Spring

0

Для выполнения операции PUT над ресурсом RestTemplate предла- гает набор из трех простых методов put(). Как и все методы класса RestTemplate, метод put() имеет три версии:

void put(URI url, Object request) throws RestClientException; void  put(String  url,  Object  request,  Object…  uriVariables)

throws RestClientException;

void  put(String  url,  Object  request,  Map<String,  ?>  uriVariables) throws RestClientException;

Простейшая версия метода put() принимает объект java.net.URI, идентифицирующий ресурс (и определяющий его местоположение), отправляемый на сервер, и Java-объект, представляющий этот ре- сурс.

Например, ниже показано, как можно использовать URI-версию метода put(), чтобы изменить ресурс Spittle на сервере:

public  void  updateSpittle(Spittle  spittle)  throws  SpitterException  { try  {

String  url  =

"http://localhost:8080/Spitter/spittles/"+          spittle.getId(); new RestTemplate().put(new URI(url), spittle);

}  catch  (URISyntaxException  e)  {

throw new SpitterUpdateException("Unable to update Spittle", e);

}

}

Несмотря на простую сигнатуру метода, возникают некоторые сложности с аргументом типа java.net.URI. Во-первых, чтобы соз- дать URL изменяемого объекта Spittle, необходимо использовать операцию конкатенации строк. Во-вторых, поскольку есть вероят- ность сконструировать недопустимый URI, который затем передает- ся конструктору класса URI, приходится перехватывать исключение URISyntaxException (даже если мы совершенно уверены в допустимо- сти URI).

Другие версии метода put(), основанные на использовании строк, избавляют от неудобств, связанных с созданием экземпляра URI, включая необходимость перехватывать исключения. Более того, эти версии метода позволяют определять URI в виде шаблона, по- зволяя передавать переменные части шаблона. Ниже представлена измененная версия метода updateSpittle(), использующая один из методов put(), основанных на применении строк:

public  void  updateSpittle(Spittle  spittle)  throws  SpitterException  { restTemplate.put("http://localhost:8080/Spitter/spittles/{id}",

spittle, spittle.getId());

}

Теперь URI определяется как простой строковый шаблон. Когда RestTemplate отправляет PUT-запрос, вместо {id} в шаблон URI будет подставлено значение, возвращаемое методом spittle.getId(). По- добно методам getForObject() и getForEntity(), последний аргумент этой версии метода put() является списком аргументов переменной длины, замещающих переменные-заполнители в шаблоне в порядке их следования.

При желании значения для переменных-заполнителей в шабло- нах можно передавать в виде отображения Map:

public   void   updateSpittle(Spittle   spittle)   throws   SpitterException   { Map<String, String> params = new HashMap<String, String>(); params.put("id",        spittle.getId()); restTemplate.put("http://localhost:8080/Spitter/spittles/{id}",

spittle, params);

}

При использовании  отображения  для  передачи  переменных в шаблон, ключи элементов в отображении должны соответствовать именам переменных-заполнителей в шаблоне URI.

Во всех версиях put() во втором аргументе передается Java-объект, представляющий изменяемый ресурс, который будет отправлен на сервер методом PUT. В данном случае это объект Spittle. Для пре- образования объектов Spittle перед отправкой на сервер класс RestTemplate будет использовать преобразователи HTTP-сообщений, перечисленные в табл. 12.2.

Формат преобразования объекта в значительной степени зависит от типа объекта, переданного методу put(). Если передать методу строковое значение, он будет использовать StringHttpMessageConverter: значение будет записано непосредственно в тело запроса, а в ка- честве типа содержимого будет выбрано значение text/plain. Ото- бражение типа MultiValueMap<String,String> будет записано в тело за- проса в форме application/x-www-form-urlencoded с помощью FormHttp- MessageConverter.

Поскольку в данном случае будут отправляться объекты Spittle, нам необходим преобразователь сообщений, способный преобразо- вывать произвольные объекты. Если в библиотеке классов прило- жения присутствует библиотека Jackson JSON, для записи объектов Spittle в формате application/json будет использоваться преобразо- ватель MappingJacksonHttpMessageConverter. Если класс Spittle отметить аннотацией поддержки сериализации JAXB и поместить библиотеку JAXB в библиотеку классов приложения, тогда объекты Spittle бу- дут записываться в тело запроса в формате application/xml.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии