基于超图SuperMap iObjects JAVA的SpringBoot工程搭建与整合(二)—— SuperMap iObjects JAVA 在SpringBoot工程中如何进行参数化配置
第一章:Nexus搭建与Maven引入
第二章:SuperMap iObjects JAVA 在SpringBoot工程中如何进行参数化配置
第三章:SuperMap iObjects JAVA如何与Spring的IOC结合
第四章:SuperMap iObjects JAVA作为Web后台的二开,在MVC中扮演什么角色,如何优雅的组织代码?
第五章:聊一聊SuperMap iObjects JAVA的奇葩设计,阅读避坑(持续更新~)
文章目录
前言
为什么要啰嗦这个?
因为高内聚、低耦合是我们学生时代就常常听到的名词,但是在工作多年后依然发现身边有人在胡乱写着。不知道是懒还是没有意识。
说到这里表达一下个人发现的小规律,关于程序员生活方面。
1.一般代码结构写的规整的程序员,他的办公桌台面通常比较规整,至少不乱。
2.代码缩进合理的人,一般电脑文件存储位置合理,且个人电脑桌面整洁(没有乱文件)。
3.喜欢给自己代码写注释的程序员,多少有点强迫症。同样,这种程序员写出得系统功能BUG率确实低,值得敬佩。
我见过初级开发人员,看到好多GIS开发人员写过的代码,配置信息直接写死到代码中,这样发布版本时候对于运维人员是很痛苦的。也无端增加了发布版本的耗时。
既然使用了SpringBoot,配置信息就选择写到yml或者数据库中吧。
一、配置信息有哪些?
SuperMap iObjects JAVA 的使用场景是扩展后台的GIS能力,所遵循的理论内容包含:工作空间、数据源、数据集、地图、场景等。
其中工作空间的名称与链接信息、数据源的名称与链接信息都应当作为应用系统的配置信息。例如:
超图空间库地址
超图空间库名称
超图空间库用户名
超图空间库用户密码
超图空间库实例名称
二、编写配置
application.yml
supermap:
server: 192.168.1.110
database: young
user_database: SuperMap
password_database: supermap@123
name_database: young
三、编写config文件
在com.supermap.config路径下创建YoungSuperMapConfig.java文件
package com.supermap.config;
import lombok.Data;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 读取项目相关配置
*
* @author young
*/
@Component
@ConfigurationProperties(prefix = "supermap")
@Setter
@Data
public class YoungSuperMapConfig {
/**
* 超图空间库地址
*/
private String server;
/**
* 超图空间库名称
*/
private String database;
/**
* 超图空间库用户名
*/
private String user_database;
/**
* 超图空间库用户密码
*/
private String password_database;
/**
* 超图空间库实例名称
*/
private String name_database;
/**
* 超图组件生成截图的路径
*/
private String cad_picture;
}
四、工作空间初始化跟随工程启动
工作空间初始化之后需要在Spring工程其他地方使用,因此工作空间的实例化以及链接工作需要交由Spring工厂进行实例化。
在MVC模型下,以赋予其Service的角色较为合理。
注意: 为了兼容数据库型工作空间和文件型工作空间,特此编写! workspaceConnectionInfo.setType(config.getDatabase() == null ? WorkspaceType.SMWU : WorkspaceType.PGSQL);
com.supermap.service路径下创建WorkSpaceService.java
package com.supermap.service;
import com.supermap.config.YoungSuperMapConfig;
import com.supermap.data.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 工作空间链接管理与数据源管理
*/
@Component
public class WorkSpaceService {
@Autowired
private YoungSuperMapConfig config;
private Workspace workspace;
private Datasources datasources;
private Maps maps;
/**
* 初始化工作空间和数据源
*/
private void init() {
workspace = new Workspace();
WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();
// 兼容pg工作空间
workspaceConnectionInfo.setType(config.getDatabase() == null ? WorkspaceType.SMWU : WorkspaceType.PGSQL);
workspaceConnectionInfo.setVersion(WorkspaceVersion.UGC70);
workspaceConnectionInfo.setServer(config.getServer());
workspaceConnectionInfo.setDatabase(config.getDatabase());
workspaceConnectionInfo.setUser(config.getUser_database());
workspaceConnectionInfo.setPassword(config.getPassword_database());
workspaceConnectionInfo.setName(config.getName_database());
// 打开工作空间
workspace.open(workspaceConnectionInfo);
datasources = workspace.getDatasources();
}
/**
* 检查工作空间
*/
private synchronized void checkWorkspace() {
if (workspace == null) {
init();
}
}
/**
* 检查数据源
*/
private synchronized void checkDatasources() {
if (datasources == null) {
init();
}
}
/**
* 检查地图
*/
private synchronized void checkMaps() {
if (maps == null) {
init();
}
}
/**
* 关闭数据源
*
* @param name
*/
public synchronized void closeDatasource(String name) {
checkDatasources();
datasources.close(name);
}
/**
* 获取工作空间
*
* @return
*/
public synchronized Workspace getWorkspace() {
checkWorkspace();
return workspace;
}
/**
* 获取数据源
*
* @return
*/
public synchronized Datasource getDatasource(String name) {
checkDatasources();
Datasource datasource = datasources.get(name);
return datasource;
}
/**
* 获取地图集合
*
* @return
*/
public synchronized Maps getMaps() {
checkMaps();
return maps;
}
}
五、测试工作空间的使用情况
这个时候就可以在test或者controller中使用工作空间中、数据源了,可以对其数据集中的内容进行管理了。
来编写一个TestController测试一下
com.supermap.controller路径下创建TestController.java文件
package com.supermap.controller;
import com.supermap.entity.SmLineQDGX;
import com.supermap.service.WorkSpaceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private WorkSpaceService workSpaceService;
// 由于ShiroConfig中配置了该路径可以匿名访问,所以这接口不需要登录就能访问
@GetMapping("/hello")
public String hello() {
workSpaceService.getWorkspace();
SmLineQDGX smLineQDGX = new SmLineQDGX();
smLineQDGX.getGeometry();
smLineQDGX.set入库时间("2023");
System.out.println(smLineQDGX.get入库时间());
return "hello spring boot and supermap startup success!";
}
}
当 workSpaceService.getWorkspace();执行成功后,意味着超图的组件启动成功,且访问工作空间完毕。
六、运行报错优先考虑是否配置了超图的许可
许可申请与配置要联系超图的技术支持人员
下面说一下怎么配置SuperMap iObjects JAVA 的环境变量
有的朋友会告诉你,超图的组件路径要配置到环境变量中,其实这是一个很low的方式。 为什么这么讲?因为作为GIS后端开发,可能电脑上有很多SuperMap iObjects JAVA 的版本包,我们是不愿意在切换项目开发的时候去修改环境变量的。而且,我们会经常修改Maven引入的iObjects 版本包,因此,我们更希望超图的组件像Maven一样因系统而异。
总结
这个系列文章所涉及的源代码,会放到资源库中供大家下载
欢迎GIS开发的小伙伴留言交流!
下一章:SuperMap iObjects JAVA如何与Spring的IOC结合