gpt4 book ai didi

spring - 在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

转载 作者:IT老高 更新时间:2023-10-28 13:50:11 26 4
gpt4 key购买 nike

在我的 PostgreSQL 9.3 + PostGIS 2.1.5 中,我有一个表 PLACE,其中有一列 coordinates 类型为 Geometry(Point,26910) .

我想将它映射到我的 Spring Boot 1.1.9 Web 应用程序中的 Place 实体,该应用程序使用 Hibernate 4.0.0 + 。 Place 可用于 REST 存储库。

不幸的是,当我 GET http://localhost:8080/mywebapp/places 我收到 这个奇怪的 JSON 响应:

{

"_embedded" : {

"venues" : [ {

"id" : 1,

"coordinates" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

"envelope" : {

等等不确定...! Spring 日志没有帮助..

我正在使用这个 application.properties:

spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update

spring.datasource.url=jdbc:postgresql://192.168.1.123/mywebapp
spring.datasource.username=postgres
spring.datasource.password=mypwd
spring.datasource.driverClassName=org.postgresql.Driver

首先,用database-platform代替database可以吗?也许我必须使用以下设置而不是上述设置?

spring.datasource.url=jdbc:postgresql_postGIS://192.168.1.123/mywebapp
spring.datasource.driverClassName=org.postgis.DriverWrapper

反正我的实体是这样的:

@Entity
public class Place {
@Id
public int id;
@Column(columnDefinition="Geometry")
@Type(type="org.hibernate.spatial.GeometryType") //"org.hibernatespatial.GeometryUserType" seems to be for older versions of Hibernate Spatial
public com.vividsolutions.jts.geom.Point coordinates;
}

我的 pom.xml 包含这个相关部分:

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1102-jdbc41</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>4.3</version><!-- compatible with Hibernate 4.3.x -->
<exclusions>
<exclusion>
<artifactId>postgresql</artifactId>
<groupId>postgresql</groupId>
</exclusion>
</exclusions>
</dependency>

有点奇怪的配置,我在网上找到的,目前最好用的一个。

我希望有人能帮助我解开这个谜团。 :)

最佳答案

最后我发现我的配置没问题,可能是 Jackson 无法正确管理 Point 数据类型。于是我定制了它的JSON序列化和反序列化:

  • 将这些注释添加到我们的 coordinates 字段:

    @JsonSerialize(using = PointToJsonSerializer.class)
    @JsonDeserialize(using = JsonToPointDeserializer.class)
  • 创建这样的序列化器:

    import java.io.IOException;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.vividsolutions.jts.geom.Point;

    public class PointToJsonSerializer extends JsonSerializer<Point> {

    @Override
    public void serialize(Point value, JsonGenerator jgen,
    SerializerProvider provider) throws IOException,
    JsonProcessingException {

    String jsonValue = "null";
    try
    {
    if(value != null) {
    double lat = value.getY();
    double lon = value.getX();
    jsonValue = String.format("POINT (%s %s)", lat, lon);
    }
    }
    catch(Exception e) {}

    jgen.writeString(jsonValue);
    }

    }
  • 创建这样的反序列化器:

    import java.io.IOException;
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import com.vividsolutions.jts.geom.Coordinate;
    import com.vividsolutions.jts.geom.GeometryFactory;
    import com.vividsolutions.jts.geom.Point;
    import com.vividsolutions.jts.geom.PrecisionModel;

    public class JsonToPointDeserializer extends JsonDeserializer<Point> {

    private final static GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 26910);

    @Override
    public Point deserialize(JsonParser jp, DeserializationContext ctxt)
    throws IOException, JsonProcessingException {

    try {
    String text = jp.getText();
    if(text == null || text.length() <= 0)
    return null;

    String[] coordinates = text.replaceFirst("POINT ?\\(", "").replaceFirst("\\)", "").split(" ");
    double lat = Double.parseDouble(coordinates[0]);
    double lon = Double.parseDouble(coordinates[1]);

    Point point = geometryFactory.createPoint(new Coordinate(lat, lon));
    return point;
    }
    catch(Exception e){
    return null;
    }
    }

    }

也许你也可以使用this serializerthis deserializer , 可用 here .

关于spring - 在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27624940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com