【问题标题】:How to get deserialized JTS Geometry field in Grails 4?如何在 Grails 4 中获得反序列化的 JTS Geometry 字段?
【发布时间】:2020-04-22 18:44:03
【问题描述】:

我正在使用 PostgreSQL + PostGIS + Grails 4 + Geoserver + React + JTS 构建一个小型地理服务器。域类有一个映射到sqlType: 'geometry(Point,4326)'com.vividsolutions.jts.geom.Point 字段。当我搜索任何findBy...(...) 搜索时,我无法得到结果,因为它是不可能的deserialize

在 Grails 2.x 中我没有遇到这个问题。这是我 3 年来第一次在 Grails 中编程。

package ....

import com.vividsolutions.jts.geom.Point

class Aqop {
  String  pid
  String  pname
  Float   x
  Float   y
  String  srid
  Point   center

  static mapping = {
    table         'aqop'
    version       false
    autoTimestamp false
    cache         true

    id     column: 'aqop_id'
    pname  column: 'pname',  type: 'text', index: 'aqop_pname_idx'
    pid    column: 'pid',    type: 'text', index: 'aqop_pid_idx'
    x      column: 'x'
    y      column: 'y'
    srid   column: 'srid',   type: 'text'
    center column: 'center', sqlType: 'geometry(Point,4326)'
  }

  static constraints = {
    pname size: 1..128, unique: true
    pid   size: 1..64,  unique: true
    x     nullable: false
    y     nullable: false
    srid  nullable: false, size: 1..64
  }
}

这是错误信息:

org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:243)
    at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:287)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:138)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:113)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:29)
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:60)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:261)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:247)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:333)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3018)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1752)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1678)
    at org.hibernate.loader.Loader.getRow(Loader.java:1567)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:731)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:990)
    at org.hibernate.loader.Loader.doQuery(Loader.java:948)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340)
    at org.hibernate.loader.Loader.doList(Loader.java:2695)
    at org.hibernate.loader.Loader.doList(Loader.java:2678)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2512)
    at org.hibernate.loader.Loader.list(Loader.java:2507)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1972)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370)
    at org.grails.orm.hibernate.query.AbstractHibernateQuery.singleResultViaListCall(AbstractHibernateQuery.java:807)
    at org.grails.orm.hibernate.query.AbstractHibernateQuery.singleResult(AbstractHibernateQuery.java:794)
    at org.grails.datastore.gorm.finders.AbstractFindByFinder.invokeQuery(AbstractFindByFinder.java:35)
    at org.grails.datastore.gorm.finders.AbstractFindByFinder$1.doInSession(AbstractFindByFinder.java:29)
    at org.grails.datastore.mapping.core.DatastoreUtils.execute(DatastoreUtils.java:319)
    at org.grails.datastore.gorm.finders.AbstractFinder.execute(AbstractFinder.java:42)
.... 

我如何反序列化域对象?欢迎任何帮助,并提前致谢。

【问题讨论】:

  • 为了解决这个问题,在创建表之后,我删除了 Grails 代码中的 Point centerfield,同时将表保存在 PostgreSQL/PostGIS 中。为了获得Geometry 字段,我调用了执行ST_SetSRID(ST_Point(x, y), srid) 的PostgreSQL / PostGIS 存储过程

标签: grails geometry jts grails-4


【解决方案1】:

根据documentation,Grails 4 与最新版本的 Hibernate 5.4 兼容。
Karel Maesen 在链接问题中指出,最新版本的 Hibernate 需要最新版本的 JTS。
将您的依赖项从 vividsolutions.jts 迁移到 locationtech.jts 并将 Point 定义为 org.locationtech.jts.geom.Point 更多信息:https://github.com/locationtech/jts

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 2021-10-26
    • 2010-09-12
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多