Ошибка при создании пространственного объекта с помощью Hibernate и GeometrySerializer: нет подходящего компонента типа «GeometryParser‹?›»

Я попытался создать простое приложение с постоянным слоем геометрии (Spring boot с hibernate-spatial)

Вот мой класс Entity:

    // Annotations from lombok project
    @NoArgsConstructor 
    @AllArgsConstructor
    @Data 
    @Builder
    @Entity
    @Table(name = "persistent_geometry")
    public class PersistentGeometry implements Serializable {
        @Id
        @GeneratedValue(generator = "uuid2")
        @GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
        @Column(name = "id", columnDefinition = "VARCHAR(255)")
        private UUID id;

        @JsonSerialize(using = GeometrySerializer.class)
        @JsonDeserialize(using = GeometryDeserializer.class)
        @Column(name = "geometry", columnDefinition = "geometry(Polygon,4326)")
        private Polygon geometry;

    }

Вот мой интерфейс репозитория

    public interface PersistentGeometryService extends CrudRepository<PersistentGeometry, UUID> {}

Вот мой класс контроллера

@RestController
public class PersistenGeometryController {

    @Autowired
    private PersistentGeometryService persistentGeometryService;

    @PostMapping(value="/persistentGeometry")
    public ResponseEntity createNewGeom(@RequestBody PersistentGeometry persistentGeometry) {
        PersistentGeometry newGeom = persistentGeometryService.save(persistentGeometry);
        var headers = new HttpHeaders();
        headers.add("Location", "/persistentGeometry/" + newGeom.getId().toString() );
        return new ResponseEntity(headers, HttpStatus.CREATED);
    }
}

Однако, когда я делаю запрос POST с этой полезной нагрузкой:

    {
    "geometry" : "POLYGON((<Some Coordinates here>))"
    }

Или его версия GeoJSON:

        {
        "geometry" : {"type":"Polygon","coordinates":[[[<Some Coordinates here>]]]}
    }

Я получил эту ошибку из своего весеннего приложения (com.geomdemo.peristentgeometry — это имя моего базового пакета):

Не удалось оценить десериализацию Джексона для типа [[простой тип, класс com.geomdemo.peristentgeometry.model.PersistentGeometry]]:

org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean-компонента с именем 'com.bedatadriven.jackson.datatype.jts.serialization.GeometryDeserializer': неудовлетворенная зависимость, выраженная через параметр конструктора 0;

вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет подходящего bean-компонента типа 'com.bedatadriven.jackson.datatype.jts.parsers.GeometryParser': ожидается по крайней мере 1 bean-компонент, который квалифицируется как Кандидат на автопроволоку. Аннотации зависимостей: {}

Не удалось оценить десериализацию Джексона для типа [[простой тип, класс com.geomdemo.peristentgeometry.model.PersistentGeometry]]:

com.fasterxml.jackson.databind.JsonMappingException: Класс com.bedatadriven.jackson.datatype.jts.serialization.GeometryDeserializer не имеет конструктора по умолчанию (без аргументов)

Я нашел предложение здесь добавить @Bean типа JtsModule, поэтому я сделал это :

        @Configuration
        public class JacksonConfig {

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

Но в моем случае это не помогло... Кажется очевидным, что загрузка SPring ищет действительный Bean типа GeometryParser... Но как реализовать такой Bean... не нашел никакой документации или примера того, как чтобы выполнить это.


person jossefaz    schedule 14.06.2020    source источник


Ответы (1)


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

Я вижу, что у вас есть аннотации Lombok, я тоже пробовал с ними, но у меня были ошибки компиляции, но я думаю, потому что мой класс extends StdDeserializer.

person cunhaf    schedule 25.06.2020
comment
привет и спасибо за ваш ответ. Я не понял вторую часть: какова связь между Ломбоком @NoArgsConstructor и extends StdDeserializer, что именно вы здесь предлагаете? - person jossefaz; 26.06.2020
comment
мое предложение состояло бы в том, чтобы изменить аннотации Lombok и написать конструкторы вручную, чтобы посмотреть, решит ли это проблему. - person cunhaf; 26.06.2020