我正在使用java(Spring-4.1.5 + Hibernate-4.3.8)和OpenLayers开发GIS应用程序。对于此项目,我使用GeoTools-13RC
,HibernateSptial-4.3
,jts-1.13
和jackson-2.5
。
在这个项目中,我在客户端和服务器中有一个层,我在一个类中保存了这个层的功能。我在下面定义了这个类:
@Entity
@Table(name="MyPoint")
public class MyPoint
{
@id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
@Column
private String name;
@Type(type = "org.hibernate.spatial.GeometryType")
@Column(name = "the_geom")
private Point geometry;
/*
*
Getter and Setter
*
*/
}
在启动应用程序时,我需要在客户端初始化该层。为此,我需要从服务器端返回一个json字符串到该层的客户端。我不想使用ST_AsGeoJson
或其他匹配。 我使用Spring REST控制器返回我的实体。
我该怎么做?
答案 0 :(得分:0)
您需要创建一个资源以向您的客户端公开。关于这个主题有一些好的Spring documentation,以及几种不同的方法,但基本上是这样的:
@Component
@Path("/my_points")
public class MyPoints {
private PointService pointService;
@GET
@Path("{pointId}")
public Response getPoint(@PathParam("pointId") String pointId) {
return Response.ok(pointService.getById(pointId)).build();
}
}
您应该使用Jackson来构建您的JSON。如果您构建Spring资源,那么在构造响应时,Jackson可能会默认使用。为了让您了解如何手动将对象转换为JSON:
@Test
public void serializingAnObjectToJson() throws Exception {
// Create a mapper that translates objects to json/xml/etc using Jackson.
ObjectMapper om = new ObjectMapper();
MyPoint point = new MyPoint(223l, "Superman");
// Creates a JSON representation of the object
String json = om.writeValueAsString(point);
// Create a JAX-RS response with the JSON as the body
Response response = Response.ok(json).build();
}
答案 1 :(得分:0)
您可以使用this link中的jackson-datatype-jts
它与弹簧的集成如下:
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="customObjectMapper"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean id="customObjectMapper" class="my.server.util.CustomObjectMapper"/><!--custom jackson objectMapper -->
package my.server.util;
import com.bedatadriven.jackson.datatype.jts.JtsModule;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext;
import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider;
import org.springframework.beans.factory.InitializingBean;
/**
*
* @author dariush
*/
public class CustomObjectMapper extends ObjectMapper implements InitializingBean{
public CustomObjectMapper() {
}
public CustomObjectMapper(JsonFactory jf) {
super(jf);
}
public CustomObjectMapper(ObjectMapper src) {
super(src);
}
public CustomObjectMapper(JsonFactory jf, DefaultSerializerProvider sp, DefaultDeserializationContext dc) {
super(jf, sp, dc);
}
@Override
public void afterPropertiesSet() throws Exception {
this.registerModule(new JtsModule());
}
}
然后在其余的控制器中,如果你返回一个Geometry,你可以得到它的geojson。