Geometry类型自定义类型转换器
2016-09-10 22:53
260 查看
WebGIS处理避免不了会用到wkt 字符串传入java后台转成Geometry的需求,但是我们以往的作法是后台直接接受一个字符串然后认为进行转换工作。其实Spring MVC 字符串自动映射成对象的处理方便相当方便,但是对于这种Geometry复杂类型是不支持的。其实要其支持也挺简单的,只要想法办让它知道如何进行转换即可。转换的思路有两种一种就是属性编辑器方式(PropertyEditor),另一种就是转换器方式(ConversionService)。这两种方式各有千秋:
2)在需要用到Geometry转换的控制器加入如下代码
这样就可以使实现转换了
2)定义GeometryConverter转换器
3)配置spring-mvc.xml文件
这两种方法都适合doConflictCheck方法中的类型转换需求(PlanConflictcheckTask 中有个字段Geometry类型字段);但是postGeometry方法的对于控制器方式会报错。
前段传递的参数
doConflictCheck
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”area”
12
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”proId”
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”projectTYPE”
城市公共服务设施项目
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”landType”
绿地与广场用地
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”businessType”
能源
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”checkType”
1
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”geometry”
POLYGON((109.8640243053 24.586129461128,109.87846004989 24.47064350446,109.98638442606 24.450021012198,110.04069032235 24.509138823349,110.04687707003 24.58475462831,109.99188375733 24.615688366703,109.8640243053 24.586129461128))
——WebKitFormBoundaryNHeZScYVf03Da6Mv–
postGeometry
——WebKitFormBoundaryde1cujNHB5HFMjAa
Content-Disposition: form-data; name=”geom”
POLYGON((109.8640243053 24.586129461128,109.87846004989 24.47064350446,109.98638442606 24.450021012198,110.04069032235 24.509138823349,110.04687707003 24.58475462831,109.99188375733 24.615688366703,109.8640243053 24.586129461128))
——WebKitFormBoundaryde1cujNHB5HFMjAa–
PropertyEditor方式,是控制器级别的。ConversionService是全局性的。
一、使用注解式控制器注册PropertyEditor(针对具体的controller类处理)
1、使用WebDataBinder进行控制器级别的注册PropertyEditor(控制器独享)
1)定义属性编辑器GeometryEditorpackage com.geoway.plan.core.support.propertyeditors; import java.beans.PropertyEditorSupport; import org.geotools.geometry.jts.JTSFactoryFinder; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; public class GeometryEditor extends PropertyEditorSupport { static GeometryFactory geometryFactory = JTSFactoryFinder .getGeometryFactory(null); @Override public void setAsText(String text) throws IllegalArgumentException { WKTReader reader = new WKTReader(geometryFactory); Geometry geom = null; try { geom = reader.read(text); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } setValue(geom); } }
2)在需要用到Geometry转换的控制器加入如下代码
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Geometry.class, (PropertyEditor) new GeometryEditor()); }
这样就可以使实现转换了
二、通过ConversionService、Converter实现类型转换(系统全局转换器)
1)定义GeometryConversionService转换服务package com.geoway.plan.core.support.convert; import java.util.Set; import javax.annotation.PostConstruct; import org.geotools.geometry.jts.JTSFactoryFinder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.converter.GenericConverter; import org.springframework.core.convert.support.GenericConversionService; import com.vividsolutions.jts.geom.GeometryFactory; public class GeometryConversionService implements ConversionService { static GeometryFactory geometryFactory = JTSFactoryFinder .getGeometryFactory(null); @Autowired private GenericConversionService conversionService; private Set<?> converters; @PostConstruct public void afterPropertiesSet() { if (converters != null) { for (Object converter : converters) { if (converter instanceof Converter<?, ?>) { conversionService.addConverter((Converter<?, ?>)converter); } else if (converter instanceof ConverterFactory<?, ?>) { conversionService.addConverterFactory((ConverterFactory<?, ?>)converter); } else if (converter instanceof GenericConverter) { conversionService.addConverter((GenericConverter)converter); } } } } @Override public boolean canConvert(Class<?> sourceType, Class<?> targetType) { return conversionService.canConvert(sourceType, targetType); } @Override public boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType) { return conversionService.canConvert(sourceType, targetType); } @Override public <T> T convert(Object source, Class<T> targetType) { return conversionService.convert(source, targetType); } @Override public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { return conversionService.convert(source, sourceType, targetType); } public Set<?> getConverters() { return converters; } public void setConverters(Set<?> converters) { this.converters = converters; } }
2)定义GeometryConverter转换器
package com.geoway.plan.core.support.convert; import org.geotools.geometry.jts.JTSFactoryFinder; import org.springframework.core.convert.converter.Converter; import org.springframework.util.Assert; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; public class GeometryConverter implements Converter<String, Geometry> { static GeometryFactory geometryFactory = JTSFactoryFinder .getGeometryFactory(null); @Override public Geometry convert(String source) { if (source == null || "".equals(source)) return null; String wkt = source; WKTReader reader = new WKTReader(geometryFactory); Geometry geom = null; try { geom = reader.read(wkt); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return geom; } }
3)配置spring-mvc.xml文件
<!-- ①注册自定义ConversionService --> <mvc:annotation-driven conversion-service="conversionService" /> <!-- 未注册时,请注册 genericConversionService--> <!-- <bean id="genericConversionService" class="org.springframework.core.convert.support.GenericConversionService"/>--> <bean id="conversionService" class="com.geoway.plan.core.support.convert.GeometryConversionService"> <property name="converters"> <set> <bean class="com.geoway.plan.core.support.convert.GeometryConverter"/> </set> </property> </bean>
三、controller中部分代码
@RequestMapping(value = "/doConflictCheck.do", method = { RequestMethod.POST }, produces = { "application/json;charset=UTF-8" }) @ResponseBody public BaseResponse doConflictCheck(HttpServletResponse httpResponse, HttpServletRequest request, @ModelAttribute PlanConflictcheckTask task) { BaseObjectResponse response = new BaseObjectResponse(); try { Object userId = PlanRequestUtil.getLoginUser(request); task.setUserId(userId != null ? userId.toString() : null); PlanConflictcheckTask taskResult = conflictcheckService .saveConflictcheckTask(task); response.setData(taskResult.getId());// 返回任务ID } catch (Exception ex) { ex.printStackTrace(); response.setMessage(ex.getMessage()); response.setStatus(CommonConstants.RESPONSE_STATUS_FAILURE); logger.error(ex.getStackTrace()); } return response; } @RequestMapping(value = "/postGeometry.do", method = { RequestMethod.POST }, produces = { "application/json;charset=UTF-8" }) @ResponseBody public BaseResponse postGeometry(HttpServletResponse httpResponse, HttpServletRequest request, @RequestParam("geom") Geometry geom) { ……
这两种方法都适合doConflictCheck方法中的类型转换需求(PlanConflictcheckTask 中有个字段Geometry类型字段);但是postGeometry方法的对于控制器方式会报错。
前段传递的参数
doConflictCheck
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”area”
12
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”proId”
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”projectTYPE”
城市公共服务设施项目
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”landType”
绿地与广场用地
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”businessType”
能源
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”checkType”
1
——WebKitFormBoundaryNHeZScYVf03Da6Mv
Content-Disposition: form-data; name=”geometry”
POLYGON((109.8640243053 24.586129461128,109.87846004989 24.47064350446,109.98638442606 24.450021012198,110.04069032235 24.509138823349,110.04687707003 24.58475462831,109.99188375733 24.615688366703,109.8640243053 24.586129461128))
——WebKitFormBoundaryNHeZScYVf03Da6Mv–
postGeometry
——WebKitFormBoundaryde1cujNHB5HFMjAa
Content-Disposition: form-data; name=”geom”
POLYGON((109.8640243053 24.586129461128,109.87846004989 24.47064350446,109.98638442606 24.450021012198,110.04069032235 24.509138823349,110.04687707003 24.58475462831,109.99188375733 24.615688366703,109.8640243053 24.586129461128))
——WebKitFormBoundaryde1cujNHB5HFMjAa–
相关文章推荐
- Webwork实现自定义数字类型转换器
- Struts2的自定义类型转换器实例
- 自定义类型转换器
- Action中的方法调用和自定义类型转换器
- 基于Struts 2的自定义类型转换器
- Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
- Struts2实现自定义转换器和全局类型转换器
- 写出自己自定义类型转换器的实现步骤及代码
- Struts 2读书笔记-----Struts 2的自定义类型转换器
- 为struts2自定义类型转换器:Date的转换
- Struts2的自定义类型转换器
- struts2 自定义类型转换器
- Struts2自定义类型转换器
- struts2自定义数据类型转换器------日期转换器
- Struts自定义类型转换器之字符串与复合对象之间的转换
- Struts2的自定义类型转换器
- Struts2之自定义类型转换器
- 框架学习之Struts2 第三节 请求参数的接收和自定义类型转换器
- Struts2自定义类型转换器
- struts2自定义类型转换器