领域服务组件自动发布机制

在前面介绍REST 服务的管理与配置中已经提及,SuperMap iServer 具有自动发布服务组件的能力,这其中也包括自动发布用户自构建的领域服务组件。只需要在 SuperMap iServer 的服务管理器或者服务配置文件中对领域服务组件进行配置,并配置 REST Servlet 的接口信息,SuperMap iServer 会自动将领域服务组件发布为 REST 风格的服务。

例如,针对将如下领域服务组件实现发布为 REST 资源:

package com.supermap.sample.DomainResource;

public class myComponent  {

        //比较两个字符串是否相同,简单参数类型,返回简单的结果。

        public boolean compareString(String str1, String str2) {

                boolean flag = true;

                if (str1 != null) {

                        if (!str1.equals(str2)) {

                                flag = false;

                        }

                } else if (str2 != null) {

                        flag = false;

                }

                return flag;

        }

}

只需将该类编译后的 Jar 包放到 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 目录下,然后在 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/config 目录下的 services.xml 文件中增加该组件的配置即可,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<server>

        ...

        <application>

                ...

                <components>

                        ...

                        <component name="myComponent"

                                class="com.supermap.sample.DomainResource.myComponent" providers="">

                        </component>

                </components>

                 ...

                 <interface name="rest" class="com.supermap.services.rest.RestServlet"></interface>

        </application>

</server>

发布为 REST 服务的领域资源根目录为:http://<iServer-root>/{domainComponentName}/rest,在本示例中,发布为 REST 服务的领域资源根目录为:

http://localhost:8090/iserver/services/myComponent/rest

其资源结构如下:

 

访问 compareStringResult 资源,获取 XML 表述的一个示例 URI 为:

http://localhost:8090/iserver/services/myComponent/rest/domainComponents/mycomponent/compareStringResult.xml?arg0="abc"&arg1="abc"

响应结果如下:

  <?xml version="1.0" encoding="UTF-8" standalone="no" ?>

  <boolean>true</boolean>

领域服务组件转为 REST 资源的规则

领域组件实现类中,所有有返回值的 public 方法都将被发布成资源,方法的参数类型和个数不同,发布成为的领域资源的类型也不同(请参见 JavaDoc 文档中的 ResourceType 枚举提到的两种领域资源类型,即 DomainArithmeticResource 和 DomainArithResultResource),下面将详细说明。

SuperMap iServer 对领域组件中的方法和领域资源分别作了分类。

(一)对于领域服务组件,SuperMap iServer 将其方法界定为简单方法和复杂方法两种:

分类 说明
简单方法 参数类型为简单类型,且参数个数在10个以下的方法。简单类型有:boolean,int,byte,short,long,double,String,char。
复杂方法 参数类型为复杂类型(除简单类型以外的其他类型),或参数个数在10个以上的方法。

(二)对于领域资源的界定。把领域资源也界定为简单领域资源和复杂领域资源,SuperMap iServer 将领域组件中的简单方法发布成简单领域资源,复杂方法发布成复杂领域资源。

分类 说明
简单领域资源 即 ResourceType.DomainArithmeticResource 类型的资源。对应简单方法,资源名为方法名后加上“Result”(注:get 方法例外,资源名为方法名去掉 get 后的部分,并且首字母小写)。该资源的参数通过 URI 传递,直接返回结果。
复杂领域资源 即 ResourceType.DomainArithResultResource 类型的资源。对应复杂方法,资源名为方法名后加上“Results”,该资源的参数通过请求体传递,通过先创建结果资源,然后获取结果资源的方式(即先 POST 后 GET),才能得到结果。

下表列举了一个类中的 public 方法跟自动发布为 REST 资源后的资源名的对应关系:

public 方法 含义 对应的资源名
void output(String s) 无返回值的方法。 无。
String getParam() get 方法,获取参数。 param
boolean isParamNull() get 方法,判断是否为空。 paramNull
boolean isParamNull(String s) 一般简单方法(参见 方法类型的说明)。 isParamNullResult
String Param() 参数为空的简单方法,用于获取 param 参数。 ParamResult
Point getCenter(Point, Point) 复杂方法,因为参数类型为复杂类型(参见 方法类型的说明)。 getCenterResults
boolean compareString(String, String) 简单方法(参见 方法类型的说明)。 compareStringResult
boolean isStrContainedInArray(String, String[]) 复杂方法,因为参数类型为复杂类型(参见 方法类型的说明)。 isStrContainedInArrayResults

需要说明的是,领域组件中 public 方法发布成 REST 资源后,使用 HTTP 方法访问时,传递的参数要按原来方法中参数的顺序,依次使用 arg0、arg1、arg2……作为参数字段的名称,参数的传递在 URI 中通过键-值对的方式进行。例如:http://localhost:8090/iserver/services/myComponent/rest/domainComponents/mycomponent/compareStringResult.xml?arg0="abc"&arg1="abc"