如何将地理位置点数据反序列化为 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<T, ID>
的javadoc
ID
的含义如下:
ID
- 存储库管理的实体 id 的类型
在您的实体 MagicPoint
中,id
的类型为 Integer
。
因此,您需要将您的存储库声明为
public interface MagicPointRepository extends Repository<MagicPoint, Integer>
而不是作为
public interface MagicPointRepository extends Repository<MagicPoint, Point>
【讨论】:
那里确实是一个小错误,但是更改后我仍然有完全相同的错误消息。 如果您有时间在本地机器上查看,我还将整个代码添加到 github 上。以上是关于如何将地理位置点数据反序列化为 Java 实体?的主要内容,如果未能解决你的问题,请参考以下文章