Класс парсинга Джексона не работает - PullRequest
0 голосов
/ 09 мая 2018

Я имею в виду этот учебник , чтобы выучить основы Джексона , но сильно упал в это.

Это исключение:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `hello.Car` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
    at [Source: (String)"{"color":"Black","type":"BMW"}"; line: 1, column: 2]

Это класс :

@Builder
@Data
@AllArgsConstructor
public class Car implements Serializable {
    private String color;
    private String type;
}

А это логика :

@Service
public class HelloService {
    public void testJackson() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        String json1 = "{\"color\":\"Black\",\"type\":\"BMW\"}";
        Car car1 = objectMapper.readValue(json1, Car.class);
    }
}

F.Y.I Я использую Джексон и Ломбок :

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.4</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
        <scope>provided</scope>
    </dependency>

В чем тут дело. Пожалуйста, поделитесь некоторыми идеями.

ОБНОВЛЕНИЕ 2018-05-10 @ Хемант Патель, спасибо. Просто добавил @NoArgsConstructor, как по волшебству. Работает как положено. Я посмотрю на это, чтобы узнать, что на самом деле происходит.

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car implements Serializable {
    String color;
    String type;
}

Кстати, спасибо @Thomas и @Alex, я проверил эти два поста, но я действительно не думаю, что реальная причина заключается в отношениях с Lombok,

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

После долгих поисков я узнал об этом из официального API документации :

публичный ObjectMapper ()

Конструктор по умолчанию, который при необходимости создаст JsonFactory по умолчанию, использует SerializerProvider в качестве своего SerializerProvider и BeanSerializerFactory в качестве его SerializerFactory. Это означает, что он может сериализовать все стандартные типы JDK, а также обычные Java Beans (на основе имен методов и специфических для Джексона аннотаций), но не поддерживает аннотации JAXB.

Как мы знаем, что такое Java Beans (на основе этой записи ):

JavaBean - это просто стандарт

  1. Все свойства частные (используйте методы получения / установки)
  2. открытый конструктор без аргументов
  3. Реализует Serializable.
0 голосов
/ 10 мая 2018

Джексону требуются конструктор по умолчанию, сеттеры и gettes для преобразования json в класс.Измените свой класс автомобиля на

public class Car implements Serializable {
private String color;
private String type;


public Car() {
}


public String getColor() {
    return color;
}

public void setColor(String color) {
    this.color = color;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}
}
...