ObjectMapper: Не мапит JSON в POJO

256
24 мая 2018, 11:50

Итак,у меня есть метод, который должен получить из запроса JSON, обработать его в POJO и вернуть его.

public MailReport send(MailMessageDto dto, String docNameWithMask) {
    LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    map.add("data", dto);
    map.add("attachment", new File("file:" + docNameWithMask));
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);
    BakOAuth2RestTemplate restTemplate = templateProvider.create(authUtils.createAuthDetails());
    ResponseEntity<String> result
            = restTemplate.exchange(properties.getMessageSenderPath(), HttpMethod.POST, requestEntity, String.class);
    String s = result.getBody();
    ObjectMapper mapper = new ObjectMapper();
    MailReport report = null;
    try {
        report = mapper.readValue(s, MailReport.class);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return report;
}

Я знаю, что сам RestTemplate умеет обращать String в POJO, но для наглядности решил получить именно String и обратить вручную.

MailReport:

public class MailReport {
    private List<MailLog> baseLogList = new ArrayList<>();
    public MailReport() {
    }
    public MailReport(List<MailLog> baseLogList) {
        this.baseLogList = baseLogList;
    }
    public List<MailLog> getBaseLogList() {
        return baseLogList;
    }
    public void setBaseLogList(List<MailLog> baseLogList) {
        this.baseLogList = baseLogList;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MailReport that = (MailReport) o;
        return Objects.equals(baseLogList, that.baseLogList);
    }
    @Override
    public int hashCode() {
        return Objects.hash(baseLogList);
    }
}

MailLog:

public abstract class MailLog implements Serializable {
    private Long id;
    private LocalDateTime dateTime;
    private Boolean success;
    private String response;
    private String to;
    private String messageType;
    private String senderType;
    private String title;
    private String content;
    public MailLog() {
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public LocalDateTime getDateTime() {
        return dateTime;
    }
    public void setDateTime(LocalDateTime dateTime) {
        this.dateTime = dateTime;
    }
    public Boolean getSuccess() {
        return success;
    }
    public void setSuccess(Boolean success) {
        this.success = success;
    }
    public String getResponse() {
        return response;
    }
    public void setResponse(String response) {
        this.response = response;
    }
    public String getTo() {
        return to;
    }
    public void setTo(String to) {
        this.to = to;
    }
    public String getMessageType() {
        return messageType;
    }
    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }
    public String getSenderType() {
        return senderType;
    }
    public void setSenderType(String senderType) {
        this.senderType = senderType;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MailLog mailLog = (MailLog) o;
        return Objects.equals(id, mailLog.id) &&
                Objects.equals(dateTime, mailLog.dateTime) &&
                Objects.equals(success, mailLog.success) &&
                Objects.equals(response, mailLog.response) &&
                Objects.equals(to, mailLog.to) &&
                Objects.equals(messageType, mailLog.messageType) &&
                Objects.equals(senderType, mailLog.senderType) &&
                Objects.equals(title, mailLog.title) &&
                Objects.equals(content, mailLog.content);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, dateTime, success, response, to, messageType, senderType, title, content);
    }
}

Как видим, всё просто. Приходящий JSON:

{"baseLogList":[{"id":44,"dateTime":[2018,5,17,12,53,50,205000000],"success":true,"response":null,"to":"slava_rossii@list.ru","messageType":null,"senderType":null,"title":"Отчёт по транзакциям за 26-02-2018","content":"Отчёт по транзакциям за 26-02-2018"}]}

И вот, report = null.

Зависимости:

compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.6.4'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.2'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.2'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.3'
Answer 1

у вас там исключение?

Как минимум потому что MailLog абстрактный. И будет проблема с полем dateTime. В вашем Json оно в виде массива, а в классе один объект.

Если вы уберете abstract и переделаете поле dateTime с LocalDateTimeна String[] или Date[](как минимум) - то все получится

READ ALSO
Unit тесты для Service-слоя

Unit тесты для Service-слоя

Здравствуйте не так давно задался вопросом на тему того как тестировать сервис-слой в приложенияхПоискав немного информации в интернете...

270
Одноразовое объявление переменной

Одноразовое объявление переменной

В общем, есть код в цикле:

195
Библиотеки криптопро

Библиотеки криптопро

с криптопро я раньше не работалНо сейчас в нашей компании возникла задача реанимировать сервис для подписи файлов

207
Почему для выбора ряда в таблице необходимо двойной клик?

Почему для выбора ряда в таблице необходимо двойной клик?

Всем приветУ меня есть страничка на которой находиться выпадающий список с именами кастомеров

265