ho intenzione di darvi un esempio di come ho leggere le intestazioni REST per i miei controller. I miei controller accettano solo application/json come tipo di richiesta se ho dei dati che devono essere letti. Sospetto che il tuo problema sia che hai un'applicazione/octet-stream che Spring non sa come gestire.
Normalmente i miei controller simile a questa:
@Controller
public class FooController {
@Autowired
private DataService dataService;
@RequestMapping(value="/foo/", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Data> getData(@RequestHeader String dataId){
return ResponseEntity.newInstance(dataService.getData(dataId);
}
Ora c'è un sacco di codice fare cose in background qui quindi mi scomposizione per voi.
ResponseEntity è un oggetto personalizzato restituito da ogni controller. Contiene una fabbrica statica che consente la creazione di nuove istanze. Il mio servizio dati è una classe di servizio standard.
La magia accade dietro le quinte, perché stai lavorando con JSON, devi dire a Spring di usare Jackson per mappare gli oggetti HttpRequest in modo che sappia cosa hai a che fare.
A tale scopo, specificando questo all'interno del vostro <mvc:annotation-driven>
blocco della vostra configurazione
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="objectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
ObjectMapper è semplicemente un'estensione del com.fasterxml.jackson.databind.ObjectMapper
ed è quello che utilizza Jackson per mappare in realtà la richiesta da JSON in un oggetto.
Ho il sospetto che tu stia ricevendo un'eccezione perché non hai specificato un mapper in grado di leggere un Octet-Stream in un oggetto o qualcosa che Spring può gestire. Se stai provando a fare un upload di file, è qualcosa di completamente diverso.
Quindi la mia richiesta che viene inviata al mio controller sembra qualcosa del genere, semplicemente ha un'intestazione extra chiamata dataId
.
Se si voleva cambiare la situazione a un parametro di richiesta e utilizzare @RequestParam String dataId
per leggere l'ID dalla richiesta richiesta sarebbe simile a questa:
contactId : {"fooId"}
Questo parametro di richiesta può essere così complesso come ti piace . Puoi serializzare un intero oggetto in JSON, inviarlo come parametro di richiesta e Spring lo serializzerà (usando Jackson) in un oggetto Java pronto per l'uso.
Esempio In Controller:
@RequestMapping(value = "/penguin Details/", method = RequestMethod.GET)
@ResponseBody
public DataProcessingResponseDTO<Pengin> getPenguinDetailsFromList(
@RequestParam DataProcessingRequestDTO jsonPenguinRequestDTO)
Richiesta Sent:
jsonPengiunRequestDTO: {
"draw": 1,
"columns": [
{
"data": {
"_": "toAddress",
"header": "toAddress"
},
"name": "toAddress",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "fromAddress",
"header": "fromAddress"
},
"name": "fromAddress",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "customerCampaignId",
"header": "customerCampaignId"
},
"name": "customerCampaignId",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "penguinId",
"header": "penguinId"
},
"name": "penguinId",
"searchable": false,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "validpenguin",
"header": "validpenguin"
},
"name": "validpenguin",
"searchable": true,
"orderable": true,
"search": {
"value": "",
"regex": false
}
},
{
"data": {
"_": "",
"header": ""
},
"name": "",
"searchable": false,
"orderable": false,
"search": {
"value": "",
"regex": false
}
}
],
"order": [
{
"column": 0,
"dir": "asc"
}
],
"start": 0,
"length": 10,
"search": {
"value": "",
"regex": false
},
"objectId": "30"
}
che viene automaticamente serializzato di nuovo in un oggetto DataProcessingRequestDTO prima di essere dato al controller pronto per me da usare.
Come potete vedere, questo è abbastanza potente che consente di serializzare i dati da JSON a un oggetto senza dover scrivere una singola riga di codice. È possibile farlo per @RequestParam
e @RequestBody
che consente di accedere a JSON all'interno dei parametri o del corpo della richiesta rispettivamente.
Ora che si dispone di un esempio concreto di spegnimento, non si dovrebbe avere alcun problema una volta modificato il tipo di richiesta su application/json
.
La tua richiesta effettiva viene inviata come 'application/octect-stream' che Spring non può deserializzare su un tipo di dati String. Metti che sia 'application/json' (se hai Jackson sul classpath) o qualunque cosa ti aspetti di consumare e potresti essere in grado di andare da qualche parte. Stai per caso tentando di caricare un file sul tuo controller REST? – JamesENL
Sto utilizzando Google Postman per effettuare la chiamata. Ho impostato il tipo di contenuto su application/json e ho ancora ricevuto l'errore. –