java - org.postgresql.util.PSQLException : ERROR: Invalid endian flag value encountered

标签 java spring-boot postgis hibernate-spatial

我咨询了很多问题,还是没有找到解决问题的办法。

我正在做一个应用程序,一些类具有几何或点类型的属性,但是在进行持久性测试时,一切都很顺利,直到我尝试保存点。

我想补充一点,我需要使用这种类型的几何图形(import org.locationtech.jts.geom.Point;),并且我找到的所有解决方案都具有该类型(import com.vividsolutions.jts.geom.Point) ;)

我认为问题在于序列化器,我有一个应该可以正常工作的序列化器,但是一个函数给了我一个错误。

pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <repositories>
        <repository>
            <id>osgeo</id>
            <name>Geotools repository</name>
            <url>http://download.osgeo.org/webdav/geotools</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-spatial</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.16.1</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>2.7.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>



</project>

应用程序属性

    ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url=jdbc:postgresql://localhost:5432/demo
spring.datasource.username= asi
spring.datasource.password= asi

# The SQL dialect makes Hibernate generate better SQL for the chosen database
#spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

#hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect
#spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect

spring.jpa.hibernate.ddl-auto = create
spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
spring.jpa.show-sql = true

“测试”dao 工作正常,因为仅在几何类型上失败。

Location l = new Location();
        Point p = geometryFactory.createPoint(new Coordinate(2,4));
        p.setSRID(SRID);
        l.setPosition(p);
        daol.create(l);

位置类别

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;

import org.locationtech.jts.geom.Point;

import es.udc.fic.model.util.CustomGeometryDeserializer;
import es.udc.fic.model.util.CustomGeometrySerializer;


@Entity
public class Location {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "loc_generator")
    @SequenceGenerator(name = "loc_generator", sequenceName = "loc_seq")
    private Long id;

    private String provider;

    private Calendar time;

//  @JsonSerialize(using = CustomGeometrySerializer.class)
//  @JsonDeserialize(using = CustomGeometryDeserializer.class)
    @Column(columnDefinition = "geometry(Point,4326)")
    private Point position;

这个序列化器应该可以工作,但是它在提到的函数中给了我一个错误 (GeometryJSON 类型中的 write (Geometry, Object) 方法不适用于参数 (Geometry, StringWriter))

 import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import org.geotools.geojson.geom.GeometryJSON;

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 org.locationtech.jts.geom.Geometry;

public class CustomGeometrySerializer extends JsonSerializer<Geometry> {

    private static GeometryJSON gjson = new GeometryJSON(8);

    public String serialize(Geometry value) {

        StringWriter writer = new StringWriter();
        /*
         try {
            gjson.write(value, writer);
        } catch (IOException e) {
        }*/
        return writer.toString();

    }

    @Override
    public void serialize(Geometry value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {

        StringWriter writer = new StringWriter();
        // gjson.write(value, writer);
        gen.writeRawValue(writer.toString());
    }
}

错误跟踪

org.postgresql.util.PSQLException: ERROR: Invalid endian flag value encountered.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143) ~[postgresql-42.2.5.jar:42.2.5]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:120) ~[postgresql-42.2.5.jar:42.2.5]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.2.0.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.2.0.jar:na]
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3174) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3688) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:90) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1453) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:510) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3282) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2478) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178) ~[hibernate-core-5.3.9.Final.jar:5.3.9.Final]

最佳答案

最后我还没有找到locationtech几何的解决方案,也许是因为它比vividsolutions更新,并且使用vividsolutions一切正常,所以我的解决方案是使用vividsolutions而不是locationtech。

我发现并且错误的另一个事实是序列化器(它不会失败地更改为vividsolutions)与数据库无关,这是hibernate专门负责的。

关于java - org.postgresql.util.PSQLException : ERROR: Invalid endian flag value encountered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881257/

相关文章:

java - 等待 Java 创建文件

java - Spring Boot Rest 服务返回 HTTP-404

postgresql - 如何避免在 PostgreSQL 9.2.1 中循环触发调用

mongodb - 如何在 MongoDB 和 PostgreSQL for GIS 之间进行选择?

java - 如何将 Project Reactor 的调度程序与基于 Executor 的库一起使用?

java - 当消息很短且攻击者已知时,是否可以找到对称 key ?

java - 使用 Runnable VS 的单个实例创建多个线程。每个线程都有单独的实例

java - 如果存在特定键 Java 8 的值,则检查列表映射

java - 无法在 Spring Boot 数据休息中启用 CORS

django - 在Windows 10中将pg:push用于Heroku