Ошибка десериализации геометрии с Джексоном - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь реализовать контроллер простой геометрии (ГИС) с базой данных PostGIS в Spring-Boot 2.2.1.

Когда я пытаюсь десериализовать объект моей задачи, который содержит полученную точечную геометриюошибка:

There was an unexpected error (type=Internal Server Error, status=500).
Could not write JSON: org.locationtech.jts.geom.Point cannot be cast to com.vividsolutions.jts.geom.Geometry; nested exception is com.fasterxml.jackson.databind.JsonMappingException: org.locationtech.jts.geom.Point cannot be cast to com.vividsolutions.jts.geom.Geometry `enter code here`(through reference chain: java.util.ArrayList[0]->com.example.depdev.entity.Task["location"])

Моя задача сущность:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import com.bedatadriven.jackson.datatype.jts.serialization.GeometryDeserializer;
import com.bedatadriven.jackson.datatype.jts.serialization.GeometrySerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import org.locationtech.jts.geom.Point;

@Entity
@Table(name = "task")
public class Task {

public Task () {
};

@Id
private Long id;
private String title;
@Column(columnDefinition = "geometry(Point,4326)")
@JsonSerialize(using = GeometrySerializer.class)
@JsonDeserialize(using = GeometryDeserializer.class)
private Point location;

// trimmed

Я пытался определить местоположение как точку и геометрию, но ошибка та же.

Мой контроллер может сохранить новую задачу, но я получаю ранее опубликованную ошибку, когда пытаюсь десериализовать ее:

@GetMapping("/alltasks")
@ResponseBody
public List allTasks() throws JsonProcessingException {

    GeometryFactory gf = new GeometryFactory();
    Double y = -36.829;
    Double x = 174.896;

    Task testTask = new Task();
    testTask.setId(new Long(01));
    testTask.setTitle("Test Task");
    Point p = gf.createPoint(new Coordinate(x, y));
    p.setSRID(4326);
    testTask.setLocation(p);
    taskRepository.save(testTask);

    List<Task> listTasks = new ArrayList<>();
    listTasks = taskService.findAll();
    return listTasks;

У меня действительно была ошибка рекурсии, котораяопубликовано здесь - но добавление класса JacksonConfig исправило эту ошибку.

Ради полноты вот конфиг-класс Джексона:

import com.bedatadriven.jackson.datatype.jts.JtsModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {
    @Bean
    public JtsModule jtsModule() {
        return new JtsModule();
    }
}

Мои зависимости в моем build.gradle :

dependencies {
implementation 'org.hibernate:hibernate-spatial'
compile group: 'org.locationtech.jts', name: 'jts-core', version: '1.16.0'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.10.0'
compile group: 'com.bedatadriven', name: 'jackson-datatype-jts', version: '2.4'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-ldap'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.springframework.security:spring-security-test'

Что мне нужно сделать, чтобы получить объект задачи в JSON без этой ошибки?

ОБНОВЛЕНИЕ

В моем коде нет ссылки на vividsolutions:

enter image description here

Ответы [ 2 ]

0 голосов
/ 16 декабря 2019

Как уже указывалось, существует зависимость, все еще использующая старую версию геометрии точки (vividsolutions.geom, а не более новую технологию location.ch).

К счастью, кто-то имеет разветвленную привязку jackson-databind. Эта ветка будет работать с локацией:

https://mvnrepository.com/artifact/com.graphhopper.external/jackson-datatype-jts/0.10-2.5-1

0 голосов
/ 11 декабря 2019

Сторонняя библиотека, которая содержит пользовательские сериализаторы JTS Jackson, все еще транзитивно использует старую версию.

Поскольку пространство имен vividsolutions было преобразовано в locationtech, вы получаете исключение времени выполнения.

Рассмотримсоздать собственный сериализатор, который принял новую геометрию locationtech.

...