SpringBoot RestController通用POST类型

时间:2015-09-30 10:27:41

标签: java spring rest spring-boot microservices

我正在尝试使用Spring Boot构建微服务。

我有一个后端API,它接收ResponseEntity POST请求并处理它(保存到数据库等)。数据是自创类的对象。

现在我有一个顶级API(处理身份验证,...)。最终用户将通过此顶级API与后端服务进行通信。所以这个API基本上只需要将所有请求转发到正确的后端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

所以我的问题是,有没有办法将这些请求转发到我的后端,而不需要在我的API中包含所有的Object类?我认为这应该是可以的,因为这与网络浏览器以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);
}

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);
}