之前曾经介绍过如何在Eclipse里通过iObjectsJava搭建Web开发环境,当时采用的还是传统的Java Web Application的方式进行开发。随着Java技术的发展,这种模式已经越来越跟不上开发的潮流了。
时下SpringBoot已经成为了事实上的开发标准,SpringCloud也正和Docker一起进行的如火如荼。所以,再不跟上时代的步伐,就要被这个时代所淘汰了。所以,笔者抓紧补充一篇文章,告诉大家如何通过SpringBoot的方式进行SuperMap iObjects Java的开发。
众所周知,想要进行SpringBoot开发,首先就得在本地搭建Maven运行环境,以及本地Maven仓库。Maven本地仓库环境的搭建网上有铺天盖地的资料,此处就不再赘述了。由于在SuperMap官网和主要的在线仓库中均没有找到SuperMap iObjects Java的包。所以首先介绍一下如何自行将SuperMap iObjects Java安装到本地的镜像仓库中。
首先找到要安装的iObjects Java的jar包,在命令行运行如下命令,就可以将对应的jar包安装到本地仓库中:
现在去本地的Maven仓库中便可找到刚才安装的jar包文件:
好了,现在就可以开始使用刚才安装的iObjectsJava仓库包文件进行SpringBoot开发了。
首先, 需要创建SpringBoot工程,搭建一个基础的SpringBoot微服务环境。如果对此有疑问可自行查阅资料。搭建好SpringBoot开发环境后,需要在pom.xml中引用上面安装到本地仓库中的objects-data包进行开发,在pom.xml加入如下依赖:
4.0.0
com.supermap.springboot
iobjectsdemo
0.0.1-SNAPSHOT
UTF-8
UTF-8
10.1.2.19530
org.springframework.boot
spring-boot-starter-parent
2.4.4
org.springframework.boot
spring-boot-starter-web
com.supermap.objects
objects-data
${supermap.version}
maven-compiler-plugin
1.8
1.8
UTF-8
org.springframework.boot
spring-boot-maven-plugin
然后就可以创建Controller类了:
package com.supermap.springboot.controllers;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.supermap.data.CursorType;
import com.supermap.data.Dataset;
import com.supermap.data.DatasetVector;
import com.supermap.data.Datasets;
import com.supermap.data.Datasource;
import com.supermap.data.DatasourceConnectionInfo;
import com.supermap.data.Datasources;
import com.supermap.data.FieldInfos;
import com.supermap.data.QueryParameter;
import com.supermap.data.Recordset;
import com.supermap.data.Workspace;
@RestController
public class QueryController {
@GetMapping(path = "/query")
public String queryData(String name) {
StringBuilder strResult = new StringBuilder("[");
Workspace workspace = new Workspace();
Datasources datasources = workspace.getDatasources();
DatasourceConnectionInfo datasourceConnectionInfo = new DatasourceConnectionInfo(
"D:\\ProgramFiles\\SuperMap\\10i\\supermap-iobjectsjava-10.1.2-19530-86195-win-all\\SampleData\\World\\World.udbx",
"sqlquery", "");
Datasource datasource = datasources.open(datasourceConnectionInfo);
// 得到数据集集合类,得到面数据集,通过数据源复制数据集
DatasetVector datasetVector = (DatasetVector) datasource.getDatasets().get("World");
// 构造查询参数类,设置查询条件
QueryParameter queryParameter = new QueryParameter();
queryParameter.setAttributeFilter("Country='" + name + "'");
queryParameter.setCursorType(CursorType.STATIC);
queryParameter.setHasGeometry(false);
// 查询得到结果记录集
Recordset recordset = datasetVector.query(queryParameter);
FieldInfos fieldInfos = recordset.getFieldInfos();
int count = fieldInfos.getCount();
List lstFields = new ArrayList();
for (int i = 0; i < count; i++) {
String fieldname = fieldInfos.get(i).getName();
lstFields.add(fieldname);
}
for (recordset.moveFirst(); !recordset.isEOF(); recordset.moveNext()) {
strResult.append("{");
for (int i = 0; i < lstFields.size(); i++) {
String fieldName = lstFields.get(i);
String fieldValue = recordset.getString(fieldName);
strResult.append("\"" + fieldName + "\":\"" + fieldValue + "\",");
}
if (strResult.length() > 0)
strResult.deleteCharAt(strResult.length() - 1);
strResult.append("},");
}
if (strResult.length() > 0)
strResult.deleteCharAt(strResult.length() - 1);
strResult.append("]");
recordset.close();
datasource.close();
workspace.close();
return strResult.toString();
}
}
此时运行工程,访问服务时一定会遇到如下错误:
这是因为没有配置iObjectsJava环境变量, 首先定义iObjectsJava的环境变量(名称随意):
将上述变量添加到Path的最前方:
重新打开Eclipse工程开发环境,然后再次启动项目运行。此时再去请求服务:
说明:上图中的结果是因为笔者使用了chrome的JSONView插件,如果未安装该插件就会以文本的方式输出,但无妨。
OK。此时开发工作基本结束了。下面还有一个工作:如何实现工程打包及绿色部署。
首先在开发环境中通过Maven的install命令生成可运行的jar包:
但此时能运行是因为我在path里为其配置了SuperMap iObjects Java的环境变量。如何能像iServer一样不往path里配置iObjects Java的路径,直接拷贝后就可以启动哪?通过参考iServer的启动方式,笔者发现通过将JRE及iObjects Java的包拷贝的可执行jar包相同的路径下,
然后再编写一下启动脚本文件(startup.bat)即可:
set WEBAPP_ROOT=%cd%
set "JRE_HOME=%WEBAPP_ROOT%\support\jre"
set "UGO_HOME=%WEBAPP_ROOT%\support\objectsjava"
set Path=%UGO_HOME%\bin;%UGO_HOME%\third_lib;%JRE_HOME%\bin;%Path%
java -jar iobjectsdemo-0.0.1-SNAPSHOT.jar
linux下的启动脚本(startup.sh)为:
export JRE_HOME=./support/jre
export LD_LIBRARY_PATH=./support/objectsjava/bin:$LD_LIBRARY_PATH
export PATH=./support/objectsjava/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:/support/objectsjava/bin:$JRE_HOME/lib:support/objectsjava/bin:$JRE_HOME/lib:$JRE_HOME/lib/tools.jar
java -jar iobjectsdemo-0.0.1-SNAPSHOT.jar &
OK,将其拷贝到没有任何SuperMap iObjects Java的新环境下,配置好许可后,双击(或在linux下运行sh命令),即可成功启动:
这样,就可以让SuperMap iObjects Java搭乘SpringCloud+SpringBoot+Docker的东风实现弹性伸缩部署了。