Сериализация (десериализация) объекта типа geometry

 
 
 
Сообщения:46
Доброго времени!

Почему Hibernate отказывается десериализовывать объекты типа geometry, не смотря на то, что данный тип поддерживает интерфейс Serializable?

Есть сущность, в которой есть поле типа geometry. Для работы с данным типом подтянул зависимость "hibernate-spatial" и прописал специальный диалект SQL в настройках hibernate.
Перед тем как использовать сущности и классы для работы с БД в проекте Spring MVC протестировал это всё в обычном проекте используя только Hibernate. Cделал часть приложения без Spring, только c hibernate, которая подключается к БД и протестировал загрузку и запись объектов, убедился что всё работает - всё работало без сериализации, hibernate она не нужна. Затем тоже самое сделал в проекте Spring MVC, выдало исключение, посмотрел пример в книжке "Spring 5 для профессионалов" Юлиана Козмина, и там в примере увидел, что прописана имплементация интерфейса Seriazable у сущностей hibernate. Как и требовалось у сущности прописал имплементацию интерфейса Serializable.
Но при попытке подгрузить объекты данной сущности выдало исключение.
Quote:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


Выяснил методом исключения, что проблема в десериализации именно поля geometry. Если исключить из объекта поле типа geometry, то всё заработает.
Проверил в интернете поддерживает ли тип org.locationtech.jts.geom.Geometry интерфейс Serializable, согласно документации он его поддерживает.

Подскажите пожалуйста в чём проблема десериализации данного типа?
Если кто-то может подсказать как можно обойтись без сериализации на уровне непосредственной работы с БД, подскажите пожалуйста как.

Буду рад любой помощи, неделю уже не могу разобраться с этой проблемой.

import org.hibernate.annotations.Type;
import org.locationtech.jts.geom.Geometry;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Collection;
 
@Entity
@Table(name = "geographkoords", schema = "dbfastwater", catalog = "")
public class Geographkoords implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer idGeographKoords;
    private Geometry koordinate;
    private String typeKoordinate;
    private Integer srid;
    private Double radiusAction;
    private Double heighSeaLevel;
  //  private String koordinateTxt;
    private String description;
    private Collection<Basin> basinsByIdGeographKoords;
    private Collection<Basinlocality> basinlocalitiesByIdGeographKoords;
    private Collection<Locality> localitiesByIdGeographKoords;
    private Collection<Post> postsByIdGeographKoords;
 
 
    public Geographkoords() {
    }
 
    public Geographkoords(Geometry koordinate, String typeKoordinate, Integer srid, Double radiusAction, Double heighSeaLevel, String description) {
        this.koordinate = koordinate;
        this.typeKoordinate = typeKoordinate;
        this.srid = srid;
        this.radiusAction = radiusAction;
        this.heighSeaLevel = heighSeaLevel;
        this.description = description;
    }
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id_GeographKoords")
    public Integer getIdGeographKoords() {
        return idGeographKoords;
    }
 
    public void setIdGeographKoords(Integer idGeographKoords) {
        this.idGeographKoords = idGeographKoords;
    }
 
    @Basic
    @NotNull
    @Column(name = "Koordinate")
    @Type(type = "org.locationtech.jts.geom.Geometry")
    public Geometry getKoordinate() {
        return koordinate;
    }
 
    public void setKoordinate(Geometry koordinate) {
        this.koordinate = koordinate;
    }
 
    @Basic
    @Column(name = "TypeKoordinate")
    public String getTypeKoordinate() {
        return typeKoordinate;
    }
 
    public void setTypeKoordinate(String typeKoordinates) {
        this.typeKoordinate = typeKoordinates;
    }
 
    @Basic
    @Column(name = "SRID_")
    public Integer getSrid() {
        return srid;
    }
 
    public void setSrid(Integer srid) {
        this.srid = srid;
    }
 
    @Basic
    @Column(name = "RadiusAction")
    public Double getRadiusAction() {
        return radiusAction;
    }
 
    public void setRadiusAction(Double radiusAction) {
        this.radiusAction = radiusAction;
    }
 
    @Basic
    @Column(name = "HeighSeaLevel")
    public Double getHeighSeaLevel() {
        return heighSeaLevel;
    }
 
    public void setHeighSeaLevel(Double heighSeaLevel) {
        this.heighSeaLevel = heighSeaLevel;
    }
 
//    @Basic
//    @Column(name = "KoordinateTxt")
//    public String getKoordinateTxt() {
//        return koordinateTxt;
//    }
//
//    public void setKoordinateTxt(String koordinateTxt) {
//        this.koordinateTxt = koordinateTxt;
//    }
 
    @Basic
    @Column(name = "Description")
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
 
    @OneToMany(mappedBy = "geographkoordsByGeographKoordsId",cascade =CascadeType.ALL,orphanRemoval = true)
    public Collection<Basin> getBasinsByIdGeographKoords() {
        return basinsByIdGeographKoords;
    }
 
    public void setBasinsByIdGeographKoords(Collection<Basin> basinsByIdGeographKoords) {
        this.basinsByIdGeographKoords = basinsByIdGeographKoords;
    }
 
    @OneToMany(mappedBy = "geographkoordsByGeographKoordsId",cascade =CascadeType.ALL,orphanRemoval = true)
    public Collection<Basinlocality> getBasinlocalitiesByIdGeographKoords() {
        return basinlocalitiesByIdGeographKoords;
    }
 
    public void setBasinlocalitiesByIdGeographKoords(Collection<Basinlocality> basinlocalitiesByIdGeographKoords) {
        this.basinlocalitiesByIdGeographKoords = basinlocalitiesByIdGeographKoords;
    }
 
    @OneToMany(mappedBy = "geographkoordsByGeographKoordsId",cascade =CascadeType.ALL,orphanRemoval = true)
    public Collection<Locality> getLocalitiesByIdGeographKoords() {
        return localitiesByIdGeographKoords;
    }
 
    public void setLocalitiesByIdGeographKoords(Collection<Locality> localitiesByIdGeographKoords) {
        this.localitiesByIdGeographKoords = localitiesByIdGeographKoords;
    }
 
    @OneToMany(mappedBy = "geographkoordsByGeographKoordsId",cascade =CascadeType.ALL,orphanRemoval = true)
    public Collection<Post> getPostsByIdGeographKoords() {
        return postsByIdGeographKoords;
    }
 
    public void setPostsByIdGeographKoords(Collection<Post> postsByIdGeographKoords) {
        this.postsByIdGeographKoords = postsByIdGeographKoords;
    }
}

public interface GeographKoordsDao {
 
    List<Geographkoords> getAll();
    List<Geographkoords> searh(Geometry koords);
    void add (String geogrKoords, String typekoords, int srid, double radiusaction,double heighSeaLevel, String description);
    void dell (Geographkoords geographKoords);
    void dell (int idKoords);
    void update (String geogrKoords, String typekoords, int srid, double radiusaction,double heighSeaLevel, String description);
}
 
@Service
@SuppressWarnings("unchecked")
@Transactional
@Repository("GeographKoordsDao")
public class GeographKoordsImplDao implements GeographKoordsDao {
 
    private static final Log logger = LogFactory.getLog(GeographKoordsImplDao.class);
    @Autowired
    private SessionFactory sessionFactory;
 
    @Override
    @Transactional(readOnly = true)
    public List<Geographkoords> getAll() {
       // sessionFactory.openSession().createQuery("select  from Geographkoords", Geographkoords.class)
        List<Geographkoords> listKoords=sessionFactory.getCurrentSession().createQuery("FROM Geographkoords e",Geographkoords.class).list();
        sessionFactory.close();
     return listKoords;
    }
 
    @Override
    @Transactional(readOnly = true)
    public List<Geographkoords> searh(Geometry koords) {
        return null;
    }
 
    @Override
    public void add(String geogrKoords, String typekoords, int srid, double radiusaction, double heighSeaLevel, String description) {
 
    }
 
    public Geometry wktToGeometry(String wellKnownText)
            throws ParseException {
 
        return new WKTReader().read(wellKnownText);
    }
 
    @Override
    public void dell(Geographkoords geographKoords) {
    }
 
    @Override
    public void dell(int idKoords) {
    }
 
    @Override
    public void update(String geogrKoords, String typekoords, int srid, double radiusaction, double heighSeaLevel, String description) {
    }
 
    @Resource(name = "sessionFactory")
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}


@Controller
@RequestMapping("/water")
public class UserController {
 
    @Qualifier("GeographKoordsService")
    @Autowired
    private GeographKoordsService geographKoordsService;
 
    @RequestMapping(value = "/koords", method = RequestMethod.GET)//Mapping web context, на который будет реагировать метод
    public @ResponseBody List<Koords> getAllKoords() {
        List<Koords> listGejgraphKoords=geographKoordsService.getAllKoordsViev();
        return listGejgraphKoords;
    }
 
 
Сообщения:46
Создал отдельно объект типа Geometry, сериализовал его и затем десериализовал - всё сработало нормально.

Не пойму, в чём проблема десериализации в проекте SPRING-MVC?

String textKoords="POINT (55.118132 51.75641)";
 
        Geometry koords=null;
        try {
            koords=wktToGeometry(textKoords);
        } catch (ParseException e) {
            System.out.println("Не удалось создать объект типа Geometry");
            e.printStackTrace();
        }
 
        try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("loc.dat")))
        {
            oos.writeObject(koords);
 
        }
        catch(Exception ex){
 
            System.out.println(ex.getMessage());
        }
 
        try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("loc.dat")))
        {
            Geometry geo=(Geometry) ois.readObject();
            System.out.printf("Name: %s \t Age: %d \n", geo.toString());
        }
        catch(Exception ex){
 
            System.out.println(ex.getMessage());
        }
Изменен:24 апр 2019 12:59
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет