2012-01-26 2 views
17

나는 스프링 3.1 MVC 프로젝트를 가지고 있고, 나는 문제가 다음 컨트롤러 메소드로 전송 요청 deserialize하는 데 :@JsonSerialize/@JsonDeserialize 스프링 MVC를 호출하지

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

요청 개체입니다 포함되어 있습니다

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

및 디시리얼라이저 :

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); 
    } 
} 
나는에 대한 사용자 지정 시리얼 라이저/디시리얼라이저를 등록한 Joda 돈 값,

그러나이 디시리얼라이저는 절대로 호출되지 않습니다. 다음 JSON을 보낼 때 400 - Bad Request 응답을 얻습니다. 이는 매퍼가 발견되지 않았다고 가정합니다.

{ 
    "amount" : "30AUD" 
} 

어떻게하면이 매퍼에 대해 스프링에게 알려야합니까, 아니면 주석이 충분합니까? 직렬화 해제 작업을 수행하기 위해 수행해야하는 다른 단계는 무엇입니까?

답변

11

Javadoc of JsonDeserialize에 따르면 getter가 아니라 setter에서 해당 주석을 사용해야합니다 (JsonSerialize은 실제로 getter에 있어야 함).

+0

당신이뿐만 아니라 디시리얼라이저 클래스를 구성해야합니까? 나는 joda-time과 똑같은 시도를하고있다. http://stackoverflow.com/q/9484869/106261 – NimChimpsky

6

또한 필드에 디시리얼라이저/시리얼 라이저를 장착 할 수 :

@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

'as = JodaMoney.class' 속성을 다음과 같이 지정한 경우 'JodaMoneyDeserializer'가 사용되지 않는 이유를 이해하고 있습니까? [documentation] (http://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/annotation/JsonDeserialize.html)? 'using ='을 사용하지만 다른 속성은 사용하지 않으면 실행시킬 수 있습니다. – JJD

+1

@JJD 이전에 "as as"주석을 사용하지 않았습니다. 하지만 올바르게 이해한다면 "AS"는 주석으로 제공하는 형식으로 비 직렬화하고 "USING"은 주석에 지정된 클래스를 사용하여 선언 된 형식으로 deserialize하는 것입니다. – Andy

+0

그래, 어쨌든 그것은 문서가 말하는 것에 어울린다. * "using()이 또한 사용된다면 그것은 우선 순위 [...]를 가지며이 주석 속성의 값은 무시된다"*. 비록 'as ='가 무시된다는 것을 확인할 수는 없지만, 동시에 두 가지를 지정할 때 그것은 전혀 작동하지 않습니다. – JJD

관련 문제