SpringBoot RestController tipo POST generici

voti
2

Sto sperimentando con microservices costruzione utilizzando Primavera Boot.

Ho un API di back-end che riceve le richieste ResponseEntity POST e lo elabora (risparmio a base di dati, ecc). Dove dati è un oggetto di una classe auto-creato.

Ora ho un'API di alto livello (che gestisce l'autenticazione, ..). Gli utenti finali potranno comunicare con i servizi di back-end attraverso questo alto livello di API. Quindi, questa API fondamentalmente è solo per inoltrare tutte le richieste verso destra back-end API.

In questa API top Non voglio avere bisogno di includere tutte le mie classi (ad esempio la classe di dati in questo caso) e vorrei piuttosto appena inviarlo come dati stringa JSON o qualcosa del genere. Così ho provato questo:

@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);
    }

Ma questo si traduce in una org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type.

Quindi la mia domanda è: esiste un modo per inoltrare tali richieste al mio back-end, senza la necessità di includere tutte le mie classi di oggetti nella mia API? Ho pensato che questo dovrebbe essere in grado dal momento che questo è lo stesso di quando un web-browser invia le richieste in formato JSON senza sapere quale tipo di oggetto dati è in realtà.

La gestione back-end simile a questa:

@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);
}
È pubblicato 30/09/2015 alle 10:27
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

Quando postate il Stringal servizio di back-end è necessario specificare l' Content-Typeintestazione in modo primavera sa che HttpMessageConverterda utilizzare per deserializzare l' Dataoggetto.

Con RestTemplateè possibile specificare l'intestazione in questo modo:

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

HttpEntity<String> entity = new HttpEntity<String>(data, headers);
restTemplate.postForEntity(url, entity, responseType);
Risposto il 30/09/2015 a 11:33
fonte dall'utente

voti
0

Anche se la questione è stata già risposto, ti faccio vedere un altro modo sono riuscito a risolvere il problema.

Ho usato il tipo Objectinvece di 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);
}
Risposto il 30/09/2015 a 12:46
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more