Я попытался создать простое приложение с постоянным слоем геометрии (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... не нашел никакой документации или примера того, как чтобы выполнить это.