如何将地理位置点数据反序列化为 Java 实体?

Posted

技术标签:

【中文标题】如何将地理位置点数据反序列化为 Java 实体?【英文标题】:How to deserialize geolocation point data to a Java entity? 【发布时间】:2019-02-05 14:46:26 【问题描述】:

我正在尝试将一个点反序列化为一个 java 对象。

这是我正在使用的实体类。

import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

import com.vividsolutions.jts.geom.*;



@Data
@Entity(name = "magic_points")
public class MagicPoint 
    @Id
    Integer id;

    @Column(name = "p", columnDefinition="Point")
    private Point point;

    @Column(name = "description")
    private String description;

存储库

import com.playground.springplayground.db.entities.MagicPoint;
import com.vividsolutions.jts.geom.Point;
import org.springframework.data.repository.Repository;

public interface MagicPointRepository extends Repository<MagicPoint, Integer> 

    List<MagicPoint> getAllByDescription(String description);

以及我如何称呼它。

        List<MagicPoint> magicPoints = magicPointRepository.getAllByDescription("Abc");

我正在为地理数据使用以下库:

编译组:'com.vividsolutions',名称:'jts',版本:'1.13'

数据库是一个 mysql,版本 8.0.13

以及我存储在数据库中的数据:

这是我收到的错误:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize] with root cause

java.io.StreamCorruptedException: invalid stream header: E6100000
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:866) ~[na:1.8.0_181]
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358) ~[na:1.8.0_181]

com.vividsolutions.jts 是用于映射存储在 SQL 数据库中的地理数据的好方法吗? 这是我想念的东西吗? 直到现在我都找不到与此相关的任何东西。如果缺少驱动程序或我应该考虑的其他依赖项,映射错误消息不会带来任何有用的信息。

编辑 为了在你的本地机器上重现它,我在 Github 上添加了代码

git clone https://github.com/florin-t/deserialize-geolocation-point.git

还有一个 README.TXT,其中包含有关数据库和 application.config 的一些说明。

【问题讨论】:

【参考方案1】:

将mysql方言设置为org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect 例如。 spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect

还要确保你没有与 hibernate 库不兼容(如果你使用 hibernate-spatial 5.2.5.Final 你的项目工作)

【讨论】:

【参考方案2】:

根据Repository&lt;T, ID&gt;的javadoc ID的含义如下:

ID - 存储库管理的实体 id 的类型

在您的实体 MagicPoint 中,id 的类型为 Integer。 因此,您需要将您的存储库声明为

public interface MagicPointRepository extends Repository<MagicPoint, Integer>

而不是作为

public interface MagicPointRepository extends Repository<MagicPoint, Point>

【讨论】:

那里确实是一个小错误,但是更改后我仍然有完全相同的错误消息。 如果您有时间在本地机器上查看,我还将整个代码添加到 github 上。

以上是关于如何将地理位置点数据反序列化为 Java 实体?的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 反序列化为实体框架无法将 int 转换为类型

Symfony 序列化器:将 Json 反序列化为实体

Symfony - 将 json 反序列化为实体数组

如何使用 Jackson 将原始 JSON 反序列化为 Java 对象

将 JSON 反序列化为现有对象 (Java)

序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})