2016-10-31 6 views
0

Я никогда не использовал Spring Boot раньше, и я хотел бы создать небольшую услугу REST с использованием mongodb. Я храню некоторые пространственные данные в базе данных и хочу сделать их доступными через интерфейс остального. Это работает и было довольно простым, но я борюсь с представлением Geojson, которое я использую по умолчанию mappig/marshalling.Как изменить сортировку geojson (GeoJsonPolygon) из mongodb в Spring Boot?

Так вот, что я до сих пор:

POJO:

@Document(collection = "geofences") 
public class Geofence { 
    @Id 
    private String id; 
    private String topic; 
    private Date expiresOn; 
    private GeoJsonPolygon geo; 

    // getters and setters 
} 

Документ в MongoDB:

{ "_id" : ObjectId("5816b03b71e2e892bd7846f3"), "topic" : "ok", "expiresOn" : ISODate("2017-01-01T00:00:00Z"), "geo" : { "type" : "Polygon", "coordinates" : [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } 

метод в контроллере REST:

public ResponseEntity<Collection<Geofence>> getAll() { 
    return new ResponseEntity<>(repository.findAll(), HttpStatus.OK); 
} 

По вызов службы отдыха I хотел бы получать GeoJSON часть, как это в моем документе, но я получаю вместо этого:

[ 
    { 
    "id": "5816b03b71e2e892bd7846f3", 
    "topic": "ok", 
    "expiresOn": 1483228800000, 
    "geo": { 
     "points": [ 
     { 
      "x": 0, 
      "y": 0, 
      "type": "Point", 
      "coordinates": [ 
      0, 
      0 
      ] 
     }, 
     { 
      "x": 3, 
      "y": 6, 
      "type": "Point", 
      "coordinates": [ 
      3, 
      6 
      ] 
     }, 
     { 
      "x": 6, 
      "y": 1, 
      "type": "Point", 
      "coordinates": [ 
      6, 
      1 
      ] 
     }, 
     { 
      "x": 0, 
      "y": 0, 
      "type": "Point", 
      "coordinates": [ 
      0, 
      0 
      ] 
     } 
     ], 
     "coordinates": [ 
     { 
      "type": "LineString", 
      "coordinates": [ 
      { 
       "x": 0, 
       "y": 0, 
       "type": "Point", 
       "coordinates": [ 
       0, 
       0 
       ] 
      }, 
      { 
       "x": 3, 
       "y": 6, 
       "type": "Point", 
       "coordinates": [ 
       3, 
       6 
       ] 
      }, 
      { 
       "x": 6, 
       "y": 1, 
       "type": "Point", 
       "coordinates": [ 
       6, 
       1 
       ] 
      }, 
      { 
       "x": 0, 
       "y": 0, 
       "type": "Point", 
       "coordinates": [ 
       0, 
       0 
       ] 
      } 
      ] 
     } 
     ], 
     "type": "Polygon" 
    } 
    } 
] 

Любые предложения? Как я могу изменить это поведение?

ответ

3

Я написал пользовательский сериализатор

public static class GeoJsonPolygonSerializer extends JsonSerializer<GeoJsonPolygon> { 

    @Override 
    public void serialize(GeoJsonPolygon value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { 
     gen.writeStartObject(); 
     gen.writeStringField("type", value.getType()); 
     gen.writeArrayFieldStart("coordinates"); 
     for (GeoJsonLineString ls : value.getCoordinates()) { 
      gen.writeStartArray(); 
      for (Point p : ls.getCoordinates()) { 
       gen.writeObject(new double[]{p.getX(), p.getY()}); 
      } 
      gen.writeEndArray(); 
     } 
     gen.writeEndArray(); 
     gen.writeEndObject(); 
    } 
} 

, но там должен быть вне коробки решение, которое я не знаю?

+0

Я просто столкнулся с тем же вопросом, и это кажется действительно смешным .. спасибо за сериализатор, большой для публикации «решения»! – gabowsky

+0

Приятно слышать, я сделал это по этой точной причине :) – greyno