2012-01-26 17 views
17

Ho un progetto Spring MVC 3.1, e sto avendo problemi deserializzazione una richiesta inviata al seguente metodo controllore:@JsonSerialize/@JsonDeserialize non richiamato con Spring MVC

@RequestMapping(value="/deposit",method=RequestMethod.POST) 
public void deposit(@RequestBody DepositRequest request) 
{ 
} 

La richiesta oggetto che contiene una valore Joda denaro, che ho registrato una consuetudine serializzatore/deserializzatore per:

public class DepositRequest { 
    private Money amount; 
    @JsonDeserialize(using=JodaMoneyDeserializer.class) 
    @JsonSerialize(using=JodaMoneySerializer.class) 
    public Money getAmount() { 
     return amount; 
    } 
    public void setAmount(Money amount) { 
     this.amount = amount; 
    } 
} 

E il deserializzatore:

public class JodaMoneyDeserializer extends JsonDeserializer<Money> { 

    @Override 
    public Money deserialize(JsonParser parser, DeserializationContext context) 
      throws IOException, JsonProcessingException { 
     String text = parser.getText(); 
     return Money.parse(text); 
    } 
} 

Tuttavia, questo deserializzatore non viene mai richiamato. Quando invio il seguente JSON, ottengo una risposta 400 - Bad Request, che presumo indichi che il mapper non è stato trovato.

Devo dire in qualche modo a Spring questo mapper o l'annotazione è sufficiente? Quali altri passaggi devo intraprendere per far funzionare la deserializzazione?

risposta

11

Secondo lo Javadoc of JsonDeserialize è necessario utilizzare quell'annotazione sul setter, non sul getter (mentre JsonSerialize dovrebbe essere sul getter).

+0

Avete configurare la classe deserializzatore come bene? Sto tentando lo stesso con joda-time http://stackoverflow.com/q/9484869/106261 – NimChimpsky

6

Si potrebbe anche collegare il deserializzatore/serializzatore per importo campo:

@JsonDeserialize(using=JodaMoneyDeserializer.class) 
@JsonSerialize(using=JodaMoneySerializer.class) 
private Money amount; 

public Money getAmount() { 
    return amount; 
} 

public void setAmount(Money amount) { 
    this.amount = amount; 
} 
+0

Capisci perché il 'JodaMoneyDeserializer' non verrebbe utilizzato se si specifica l'attributo' as = JodaMoney.class' come specificato in la [documentazione] (http://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html)? Potrei farlo funzionare solo quando uso 'using =' ma nessun altro attributo. – JJD

+1

@JJD Non ho usato "come" annotazione prima. Ma se ho capito bene, "AS" è per deserializzare in tipo che fornisci in annotazione e "USING" è per deserializzare in tipo dichiarato usando la classe specificata nell'annotazione. – Andy

+0

Sì, in qualche modo si adatta a ciò che dicono i documenti: * "se si usa anche use() ha precedenza [...] e il valore di questa proprietà di annotazione viene ignorato" *. Anche se, non posso confermare che 'as =' è ignorato - non ha funzionato affatto per me quando ho specificato entrambi allo stesso tempo. – JJD

Problemi correlati