2015-09-30 3 views
2

Я экспериментирую с созданием микросервисов с использованием Spring Boot.SpringBoot RestController generic POST type

У меня есть интерфейсный API, который получает запросы POST-запроса ResponseEntity и обрабатывает его (сохранение в базу данных и т. Д.). Где Data является объектом самосоздаваемого класса.

Теперь у меня есть API верхнего уровня (который обрабатывает аутентификацию, ..). Конечные пользователи будут взаимодействовать с внутренними службами через этот API верхнего уровня. Таким образом, этот API в основном просто должен пересылать все запросы в правый back-end api.

В этом верхнем API я не хочу включать все мои классы (например, класс Data в этом случае), и я бы скорее просто послал его как данные String json или что-то в этом роде. Так что я попытался это:

@RequestMapping(method = RequestMethod.POST, value="/data") 
    ResponseEntity<String> createUnit(@RequestBody String data) { 
     URI uri = util.getServiceUrl("dataservice"); 
     String url = uri.toString() + "/data"; 

     ResponseEntity<String> result = restTemplate.postForEntity(url, data, String.class); 
     return new ResponseEntity<String>(result.getBody(), HttpStatus.OK); 
    } 

Но это приводит к org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type.

Итак, мой вопрос в том, есть ли способ перенаправить эти запросы в мой back-end без необходимости включать все мои классы объектов в мой API? Я полагал, что это должно быть возможно, так как это то же самое, что когда веб-браузер отправляет запросы в формате json, не зная, какой именно объект является фактическим.

обработка

Бэкэнда выглядит следующим образом:

@RequestMapping(method = RequestMethod.POST, value="/data") 
ResponseEntity<Data> saveData(@RequestBody Data data) { 
    //Some code that processes the data 
    return new ResponseEntity<Data>(dataProcessed, HttpStatus.OK); 
} 
+0

Вам не нужно возвращать '' ResponseEntity . Используйте данные напрямую. Это приведет к сериализации данных как Json. При необходимости вы можете использовать конвертер Jackson. Используйте базовый класс в качестве возвращаемого типа, если вам нужен общий тип возврата –

+0

@ViswanathLekshmanan. Основные API также отправляют соответствующие коды «HttpStatus», например. '404', когда объект Data не был найден, или' 204', когда он был успешно удален и т. Д. Логика определения кода HttpStatus связана с этими базовыми API и не должна происходить в верхнем слое. Вот почему я отправляю данные с помощью 'ResponseEntity' – Kaj

ответ

2

При проводке String на внутренний интерфейс сервиса вы должны указать заголовок Content-Type так Spring знает, какие HttpMessageConverter использовать десериализовать Data объект.

С RestTemplate вы можете указать заголовок, как это:

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 

HttpEntity<String> entity = new HttpEntity<String>(data, headers); 
restTemplate.postForEntity(url, entity, responseType); 
+0

Спасибо, это работает! Другим решением, которое я нашел, было использование 'Object' в качестве типа данных вместо' String' – Kaj

0

Даже если вопрос уже ответил, я покажу еще один способ, которым я сумел решить эту проблему.

Я использовал тип Object вместо String:

@RequestMapping(method = RequestMethod.POST, value="/data") 
ResponseEntity<Object> createUnit(@RequestBody Object data) { 
    URI uri = util.getServiceUrl("dataservice"); 
    String url = uri.toString() + "/data"; 

    ResponseEntity<Object> result = restTemplate.postForEntity(url, data, Object.class); 
    return new ResponseEntity<Object>(result.getBody(), HttpStatus.OK); 
} 

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

  • Нет связанных вопросов^_^