0

У меня есть следующий POJO:Как написать initbinder для десериализации json?

class MyClass{ 
    ... 
    HttpStatus httpStatus = HttpStatus.OK //from org.springframework.http 
    @JsonIgnore 
    public HttpStatus getHttpStatus() { 
     return httpStatus; 
    } 

    @JsonProperty(value = "HttpStatus") 
    public void setHttpStatus(HttpStatus httpStatus) { 
     this.httpStatus = httpStatus; 
    } 
    .... 
} 

Когда я принимаю (построить) объект из формы для исправления преобразования строки в HttpStatus я написал InitBinder:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(HttpStatus.class, new PropertyEditorSupport() { 
     public void setAsText(String code) { 
      if (StringUtils.isNotBlank(code)) { 
       setValue(HttpStatus.valueOf(Integer.parseInt(code))); 
      } 
     } 
    }); 

Для вида он работает здорово.

У меня также есть метод контроллера, который принимает JSON:

@RequestMapping(value = "sendData.json", method = RequestMethod.POST, consumes = "application/json;charset=UTF-8", 
      headers = "content-type=application/x-www-form-urlencoded") 
    @ResponseStatus(HttpStatus.NO_CONTENT) 
    public void putJsonData(@RequestBody MyClass myClass) { 
     .... 
    } 

Я прохожу httpStatus так:

... 
"HttpStatus":500 
... 

но он преобразует неправильно, и я вижу следующее сообщение об ошибке:

Bad Request","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Could not read JSON: Can not construct instance of org.springframework.http.HttpStatus from number value (500): index value outside legal index range [0..65]\n 

Как я понимаю, он неправильно преобразует.

Как настроить этот процесс?

ответ

1

Проблема была решена следующим образом:

class MyClass{ 
    ... 
    HttpStatus httpStatus = HttpStatus.OK //from org.springframework.http 
    @JsonIgnore 
    public HttpStatus getHttpStatus() { 
     return httpStatus; 
    } 

    @JsonProperty(value = "HttpStatus") 
    @JsonDeserialize(using = HttpStatusDeserializer.class) 
    public void setHttpStatus(HttpStatus httpStatus) { 
     this.httpStatus = httpStatus; 
    } 
    .... 
} 

и десериализатор:

public class HttpStatusDeserializer extends JsonDeserializer<HttpStatus> {  
    @Override 
    public HttpStatus deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { 
     ObjectCodec oc = jsonParser.getCodec(); 
     JsonNode node = oc.readTree(jsonParser); 
     return HttpStatus.valueOf(Integer.parseInt(node.asText())); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^