Ошибка разбора Необязательно <T>с Jackson / Springboot - PullRequest
0 голосов
/ 31 августа 2018

У меня есть класс, и я бы предпочел иметь значения Optional<T>, такие как Optional<Integer> value;.

В этом проекте Springboot используется для создания веб-контроллеров, а клиенты отправляют / получают через json.

Когда клиент помещает или публикует сообщения, а класс синтаксического анализа в java имеет параметры типа Optional<T>, происходит сбой; в остальном работает нормально. Тем не мение; Optional<T> предпочтительнее, потому что мы хотим дать клиенту возможность пропустить поля, если они не используются.

Например:

Это работает:

public class TestClass {

    private final int testValue;

    public TestClass(@JsonProperty("testValue") int testValue) {
        this.testValue = testValue;
    }

    public int getTestValue() {
        return testValue;
    }
}

Это не:

public class TestClass {

    private final Optional<Integer> testValue;

    public TestClass(@JsonProperty("testValue") Optional<Integer> testValue) {
        this.testValue = testValue;
    }

    public Optional<Integer> getTestValue() {
        return testValue;
    }
}

Вот несколько строк версии от Gradle.

springBootVersion = '1.5.8.RELEASE'

compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml', version: '2.6.4'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jdk8', version: '2.6.3' 

При POSTing с почтальоном и значением int все работает. Когда я использую Optional<Integer>, я получаю следующий ответ об ошибке от веб-вызова.

Обобщенная:

"исключение": "Org.springframework.http.converter.HttpMessageNotReadableException", "message": "Ошибка синтаксического анализа JSON: 0; вложенное исключение com.fasterxml.jackson.databind.JsonMappingException: 0 (через ссылочная цепочка: … (Мой путь к классу)… [\ "actions \"] -> java.util.ArrayList [3]) ",

Ответы [ 5 ]

0 голосов
/ 05 сентября 2018

Без изменения какого-либо существующего кода обновление Джексона до версии 2.8.6 исправлено.

Я следовал другому ответу выше, как ни странно, обновление до более высокой версии `2.9.6 'не сработало. Это, однако, дало мне новое сообщение об ошибке, которое в конечном итоге привело меня к обсуждению, в котором другим людям также пришлось понизить рейтинг.

0 голосов
/ 01 сентября 2018

Необязательно означает, что это не обязательно тот объект, который вы ищете! Таким образом, вы можете просто использовать обертку. Вы можете вернуть объект (если объект присутствует) или вернуть статус 404, если ваш объект отсутствует.

public static <X> ResponseEntity<X> wrapOrNotFound(Optional<X> maybeResponse, HttpHeaders header) {
    return maybeResponse.map(response -> ResponseEntity.ok().headers(header).body(response))
            .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
0 голосов
/ 31 августа 2018

Есть модуль Джексона, который помогает сериализовать / десериализовать Optional параметры.

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jdk8</artifactId>
   <version>2.9.6</version>
</dependency>

Затем зарегистрируйте модуль с вашим ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());

Пример здесь: https://www.baeldung.com/jackson-optional

0 голосов
/ 31 августа 2018

java.util. Опционально не сериализуемо

0 голосов
/ 31 августа 2018

Вам нужно изменить второй пример на

public TestClass(@JsonProperty("testValue") int testValue) {
    this.testValue = Optional.of(testValue);
}
...