Sto provando a creare un controller MVC Spring che riceverà un modulo POST con un parametro in formato JSON e Spring lo convertirà automaticamente in un oggetto Java.Conversione automatica del parametro del modulo JSON in Spring MVC 4.0
- Tipo di richiesta contenuto è
application/x-www-form-urlencoded
- Il nome del parametro che contiene una stringa JSON è
data.json
Questo è il controller:
@Controller
public class MyController {
@RequestMapping(value = "/formHandler", method = RequestMethod.POST)
public @ResponseBody String handleSubscription(
@RequestParam("data.json") MyMessage msg) {
logger.debug("id: " + msg.getId());
return "OK";
}
}
E questo è ciò che il MyMessage oggetto appare come:
public class MyMessage {
private String id;
// Getter/setter omitted for brevity
}
Forse non a caso, la pubblicazione di un modulo con il parametro data.json = { "id": "Ciao"} risultati in errore HTTP 500 con questa eccezione:
org.springframework.beans.ConversionNotSupportedException:
Failed to convert value of type 'java.lang.String' to required type 'MyMessage'
nested exception is java.lang.IllegalStateException:
Cannot convert value of type [java.lang.String] to required type [MyMessage]: no matching editors or conversion strategy found
Se ho letto il MappingJackson2HttpMessageConverter docs correttamente, Jackson JSON la conversione è innescato da Content-Type application/json
, che io ovviamente non posso usare dal momento che questa è una forma POST (e io non controllo la parte di invio).
E 'possibile ottenere Spring per convertire la stringa JSON in un'istanza di MyMessage, o dovrei semplicemente rinunciare, leggerlo come una stringa ed eseguire la conversione da solo?
_e io non controllo il distacco part_ vostro cliente deve seguire le specifiche del server, non il contrario. –
Il client è un meccanismo di webhook di terze parti di cui non ho alcun controllo. Ma la tua affermazione mi incuriosisce, c'è qualcosa nelle specifiche HTTP che proibisce l'invio di dati JSON usando un campo modulo/parametro post? –
No, non c'è, ma con REST è diventato convenzionale averlo nel corpo. –