2015-02-26 4 views
2

У меня есть служба отдыха, которая получает массив объектов, и мне нужно преобразовать json info обратно в список объектов; мой стек построен на вершине Spring 4Массив объектов как параметр в службе отдыха

Я получил это определение службы:

@RequestMapping(value = "/services/crud/dangers/createDanger", method = RequestMethod.GET) 
    public @ResponseBody GenericServiceReturn createDanger(
      @RequestParam(value = "postionId", required = true) Long positionId, 
      @RequestParam(value = "dangerName", required = true) String dangerName, 
      @RequestParam(value = "type", required = true) Integer type, 
      @RequestParam(value = "description", required = true) String description, 
      @RequestParam(value = "words", required = true) List<RestWord> words) 

Как вы можете видеть, слова параметров является Список RestWord, который определяется следующим образом:

public class RestWord { 
    private long id = -1; 
    private String name; 
    private long type = -1; 

также я определил конвертер, как это:

public class RestWordConverter implements Converter<String, RestWord>{ 
    private static final Logger log = LoggerFactory 
      .getLogger(RestWordConverter.class); 

    @Override 
    public RestWord convert(String text) { 
     // TODO Auto-generated method stub 
     log.info(text); 
     return new RestWord(); 
    } 

} 
не

много логики до сих пор, как у ou может видеть, также получил конвертер, зарегистрированный в mvc-контексте, как это.

<mvc:annotation-driven conversion-service="conversionService" /> 

<beans:bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" > 
     <beans:property name="converters"> 
      <beans:list> 
       <beans:bean class="co.com.lineascontrol.core.endpoints.converters.RestWordConverter"/> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

Проблема в том, что класс конвертер вызывается для каждого кусочка сообщения JSon, чтобы показать, что простой пример, для входящего сообщения:

String words = "[{\"id\":0,\"name\":instalar,\"type\":-1},{\"id\":0,\"name\":ventilacion,\"type\":-1},{\"id\":0,\"name\":tunel,\"type\":-1}]"; 

Я получаю это на сервере выхода:

c.c.l.c.e.c.RestWordConverter - [{"id":0 
c.c.l.c.e.c.RestWordConverter - "name":instalar 
c.c.l.c.e.c.RestWordConverter - "type":-1} 
c.c.l.c.e.c.RestWordConverter - {"id":0 
c.c.l.c.e.c.RestWordConverter - "name":ventilacion 
c.c.l.c.e.c.RestWordConverter - "type":-1} 
c.c.l.c.e.c.RestWordConverter - {"id":0 
c.c.l.c.e.c.RestWordConverter - "name":tunel 
c.c.l.c.e.c.RestWordConverter - "type":-1}] 

это означает функцию преобразователя называется один раз для каждой части сообщения, и делая это невозможно преобразовать входящую строку в конкретном объект.

Я также стандартные преобразователи JSon определены следующим образом:

<beans:bean 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <beans:property name="messageConverters"> 
      <beans:list> 
       <beans:ref bean="jsonMessageConverter" /> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

    <!-- Configure bean to convert JSON to POJO and vice versa --> 
    <beans:bean id="jsonMessageConverter" 
     class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
    </beans:bean> 

Я считаю, что преобразователь должен быть определен как JSon преобразователь, а не в качестве службы преобразования для MVC, но я не успел найти примеры или документацию об этом.

Решение

Привет, в случае, если кто-то борется с этим мне удалось получить все и работает.

Прежде всего, если вы новичок в покое, я нашел эту простую статью, описывающую основной, но очень важные вещи:

http://www.drdobbs.com/web-development/restful-web-services-a-tutorial/240169069?pgno=1

После этого я понял, большинство моих проблем, поэтому на end это мой сервисный интерфейс:

@RequestMapping(value = "/services/crud/dangers/createDanger", method = RequestMethod.POST) 
    public @ResponseBody GenericServiceReturn createDanger(
      @RequestBody List<RestWord> words, 
      @RequestParam(value = "postionId", required = true) Long positionId, 
      @RequestParam(value = "dangerName", required = true) String dangerName, 
      @RequestParam(value = "type", required = true) String type, 
      @RequestParam(value = "description", required = true) String description) { 

И вот правильный способ его обьятия!

List<RestWord> restWordList = new ArrayList<RestWord>(); 

      //put some values in the list! or whatever object you are using 

      url = "http://localhost:8080/LineasControllBussinesLayer/rest/services/crud/dangers/createDanger"; 

      //add the uri params 
      Map<String, Object> requestParams = new HashMap<String, Object>(); 
      requestParams.put("postionId", 1l); 
      requestParams.put("dangerName", dangerName); 
      requestParams.put("type", DANGER_TYPE.ACTIVITIE); 
      requestParams.put("description", "actividad repeligrosa"); 

      // Create the request body as a MultiValueMap 

      System.out.println(restWordList); 
      //see how the HttpEntity is created with the first parameter as the object, and the second are the header, in my case I use the headers to aunteticate 
      HttpEntity<List<RestWord>> entity2 = new HttpEntity<List<RestWord>>(restWordList, headers); 


      //then just call the service!!! 
      System.out.println(restTemplate.postForObject(url, entity2, String.class, requestParams)); 

Пожалуйста, имейте в виду, что это просто тестовый код, фактические запросы должны быть обернуты в объект запроса, и все должно идти внутри тела запроса

+0

Вы просто пытаетесь преобразовать входящий json в список объектов? –

+0

Я бы предложил использовать сервис POST, который получает JSON в теле запроса и автоматически сопоставляет его с java-объектами с помощью Jackson. – Nailgun

+0

rigth @LukeSpringWalker, объекты типа RestWord. –

ответ

1

Я бы рекомендовал использовать @Resquestbody на карте json к объекту. Имейте в виду объединить его с @RequestParam, так как он может работать или не задаваться версией, и он должен быть в определенном порядке (в этом случае старайтесь избегать @ResquestParam).

Посмотрите на: Spring MVC - Why not able to use @RequestBody and @RequestParam together Прочитать до последнего комментария.

+0

Я понимаю, что мне нужно изменить StringHttpMessageConverter? нет способа просто внедрить конвертер? Я спрашиваю, потому что я буду использовать несколько разных объектов в mys-запросах. Я уже просто изменил определение службы, добавляющ часть @RequestBody, но все еще имею такое же поведение. –

+0

На всякий случай, мой реальный метод имеет много параметров, а не только массив. –

+0

Почему вы не создаете объект, который является представлением данных, которые вы получаете, и используйте @RequestBody для его сопоставления (это равно одному объекту, соответствующему всем данным). Таким образом, вы делегируете ответственность Spring, но вы должны знать об этом, не передавать объект в ядро ​​вашего приложения, он должен жить только на уровне контроллера. –

Смежные вопросы