Spring Post Controller не сериализует JSON-запрос к Java-объекту - PullRequest
0 голосов
/ 05 июня 2018

Итак, у меня есть этот контроллер:

@RequestMapping(value = "/zone/settings/ranged/update", method = RequestMethod.POST, produces="application/json", consumes="application/json")
public @ResponseBody ResponseEntity<Map<String, Object>> zoneSettingsRangedUpdate(
        WebRequest request,
        @RequestBody RoundRangeData data,
        Map<String, Object> model
) throws IOException {
    model.put("request", data);
    model.put("success",true);

    return new ResponseEntity<>(model, HttpStatus.OK);
}


С этим как POJO:

public class RoundRangeData {
    private BigInteger pricingDate;
    private Long zoneid;
    private Long psid;
    private Float roundTo;
    private Float lowerLimit;
    private Float upperLimit;

public RoundRangeData() {

}

public RoundRangeData(BigInteger pricingDate, Long zoneid, Long psid, Float roundTo, Float lowerLimit, Float upperLimit) {
    this.pricingDate = pricingDate;
    this.zoneid = zoneid;
    this.psid = psid;
    this.roundTo = roundTo;
    this.lowerLimit = lowerLimit;
    this.upperLimit = upperLimit;
}

public BigInteger getPricingDate() {
    return pricingDate;
}

public void setPricingDate(BigInteger pricingDate) {
    this.pricingDate = pricingDate;
}

public Long getZoneid() {
    return zoneid;
}

public void setZoneid(Long zoneId) {
    this.zoneid = zoneId;
}

public Long getPsid() {
    return psid;
}

public void setPsid(Long psid) {
    this.psid = psid;
}

public Float getRoundTo() {
    return roundTo;
}

public void setRoundTo(Float roundTo) {
    this.roundTo = roundTo;
}

public Float getLowerLimit() {
    return lowerLimit;
}

public void setLowerLimit(Float lowerLimit) {
    this.lowerLimit = lowerLimit;
}

public Float getUpperLimit() {
    return upperLimit;
}

public void setUpperLimit(Float upperLimit) {
    this.upperLimit = upperLimit;
}
}

Используя этот запрос (скриншот Chrome devtools,фактический запрос имеет кавычки вокруг свойств):

enter image description here

И я продолжаю получать эту ошибку:

ПРЕДУПРЕЖДЕНИЕ: Не удалось записатьHTTP-сообщение: org.springframework.http.converter.HttpMessageNotWritableException: Невозможно записать содержимое: Сериализатор не найден для класса org.springframework.validation.DefaultMessageCodesResolver и не обнаружены свойства для создания BeanSerializer (исключение исключения можно исключить, исключить исключение BeanSerializer).FAIL_ON_EMPTY_BEANS) (через цепочку ссылок: org.springframework.validation.support.BindingAwareModelMap ["org.springframework.validation.BindingResult.roundRangeData"] -> org.springframework.validation.BeanRoResRenceColver "вложенное исключение - com.fasterxml.jackson.databind.JsonMappingException: не найден сериализатор для класса org.springframework.validation.DefaultMessageCodesResolver и не обнаружены свойства для создания BeanSerializer (чтобы избежать исключения, отключите SerializationFeature.FAIL_ON_EMPTY_ chain_pr_signer_prise_base_scr_set_prof_signer_pris_in_serf).validation.support.BindingAwareModelMap ["org.springframework.validation.BindingResult.roundRangeData"] -> org.springframework.validation.BeanPropertyBindingResult ["messageCodesResolver"])

10: попыталось 10: 10*
  • Изменены средства доступа к полям на общедоступные
  • Попытка переваривания нормальной строки, та же ошибка
  • Аннотировал каждый метод получения с помощью @ JSONProperty
  • Создает модульный тест и вызываетконтроллер, использующий сгенерированный JSON из сопоставителя объектов из экземпляра объекта RoundRangeData

Сериализация объектов Java в JSON работает для ответов, но мне не повезло, сериализация JSON в объекты Javaв моих контроллерах.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Попробуйте это.

public class MapSerializer extends JsonSerializer<SpecialMap> {
    @Override
    public void serialize(SpecialMap map, JsonGenerator jgen,
                          SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jgen.writeStartObject();
        for (String key : map.keySet()) {
            jgen.writeStringField(key, map.get(key));
        }
        jgen.writeEndObject();
    }
}


public class SpecialMap extends HashMap<String,String> {
}


@RequestMapping(value = "/zone/settings/ranged/update", method = {RequestMethod.POST}, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Map<String, Object>> zoneSettingsRangedUpdate(
            @RequestBody RoundRangeData data
    ) throws IOException {

        Map<String, Object> model = new HashMap<>();
        ObjectMapper mapper = new ObjectMapper();

        SimpleModule module = new SimpleModule();
        module.addSerializer(SpecialMap.class, new MapSerializer());
        mapper.registerModule(module);

        String serialized = mapper.writeValueAsString(data);
       // return serialized;
        model.put("request", serialized);
        model.put("success",true);

        return new ResponseEntity<Map<String, Object>>(model, HttpStatus.OK);
    }

См. Изображение успешного ответа.enter image description here

0 голосов
/ 05 июня 2018

Вам необходимо удалить атрибут model из списка параметров.Проблема, если вы включите FAIL_ON_EMPTY_BEANS для Джексона, вы получите огромный ответ, который содержит много информации, которая, я уверен, вам не нужна.

Я бы вернул в новом ResponseEntity что-то еще, например, создание собственной карты, если вы этого желаете.

0 голосов
/ 05 июня 2018

Вам нужно только реализовать Serializble в вашем pojo

public class RoundRangeData implements Serializable {
    //code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...