基于 JAX-RS 机制扩展领域资源

发送反馈


SuperMap iServer 提供了 Restlet、JAX-RS 两种机制,方便将领域功能发布为 REST 资源。其中,有关 JAX-RS 机制请参见:JAX-RS 简介

定义 REST 资源

资源基类

在 SuperMap iServer JAX-RS 机制的 REST 实现框架中,最高层的资源类是 com.supermap.services.rest.resources.JaxrsResourceBase,所有的资源实现类都直接或间接地继承于它。

com.supermap.services.rest.resources.JaxAlgorithResultSetResource<T> 对 JaxrsResourceBase 进一步实现,方便要求支持 POST 请求的资源的实现。

继承 JaxrsResourceBase 或 .JaxAlgorithResultSetResource<T>,按照 JAX-RS 标准定义资源即可。

注意:

  1. 资源实现类要添加 @Component 注记,来表明该资源关联的服务组件,如:
@Path("/addressmatch")
// 申明该资源需要使用的业务组件
@Component(interfaceClass = com.supermap.services.components.AddressMatch.class)
public class AddressMatchResource extends JaxrsResourceBase {
        ...
}
  1. 可以省略@produce、@Consumes 注记,基于 iServer 资源基类实现的 JAX-RS 资源, 默认支持 xml、json、rjson 表述格式,以及 json 参数格式。

获取服务组件

SuperMap iServer 中,服务组件通过相匹配的服务接口发布为 Web 服务,在资源实现类中,通过服务接口上下文获取服务组件,从而获取相应的 GIS 功能。

JaxrsResourceBase 提供了 getInterfaceContext() 接口,资源实现类可直接使用,获取服务接口上下文,从而获取服务组件,代码片段如下:

                InterfaceContext interfaceContext=super.getInterfaceContext();
                List<Temperature> tempratureComponents=interfaceContext.getComponents(Temperature.class);
                Temperature tempratureComponent=tempratureComponents.get(0);

定义 HTML 表述

在 JAX-RS 机制的 REST 资源实现类中,SuperMap iServer 提供了@Template 注记指定 FreeMarker 模板,示例代码片段如下:

@GET
@Path("{cityname}")
@Template(name = "temperature.ftl")
public String getMapImageURI(
                @PathParam("cityname") String cityname,
                @Context HttpServletRequest request) {
        ...
}

FreeMarker 是基于模板生成文本输出的通用工具。*.ftl 可以跟资源实现类一起打的 Jar 中,*.ftl 文件需要放在 Jar 包:///templates 目录下。@Template 注记中 name 指定的即是*.ftl 文件的文件名。

SuperMap iServer 提供了一些变量供用户在制作*.ftl 模板时使用,从而获取资源信息,参见:iServer 提供的 FreeMarker 变量

资源配置

首先,可通过配置文件说明了解“模块配置文件”和“资源配置文件”两个概念。领域模块发布为 REST 资源时,需要建立这两个文件。这两个文件都打在 Jar 包里,实现扩展模块的即插即用,方便系统管理员配置。

模块配置文件位于 Jar:///META-INF/extensions/services/rest 位置;

资源配置文件位于 Jar 包中,位置由模块配置文件中的 resourceFiles 项指定。

资源配置可跟资源实现类、FreeMarker 模板,打成一个 Jar 包。Jar 包放到 %SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 目录下,启动 SuperMap iServer 服务即可。

示例

示例工程可在以下位置获取:%SuperMap iServer_HOME%\samples\code\DSSE_JSR。

示例说明参见:基于 JAX-RS 机制定义 REST 资源

作为一个整体的工程文件,用户使用时需要把工程导入并编译后导出为 JAR 包(参见:dsse_jsr.jar),然后放在%SuperMap iServer_HOME%\webapps\iserver\WEB-INF\lib 下,并配置 服务配置文件(详见服务配置文件结构),启动 iServer 服务即可。

扩展表述生成器

自定义的 REST 资源默认支持的表述格式有:xml、json、rjson,在通过 @Template 注记定义了 FreeMarker 模板后,还支持 HTML 表述。可对此进行扩展,使领域资源支持更多的表述格式。

JAX-RS 机制下,REST 资源表述生成器的扩展遵循 JAX-RS 标准。基于 javax.ws.rs.ext.MessageBodyWriter 实现,使用@Provider 标注来注册使用自定义的 MessageBodyProvider,并使用@Produces 指定媒体类型。

 

扩展过程跟现有 REST 资源扩展中的扩展表述生成器一致,参见:表述生成器扩展

注意:资源响应的媒体类型由 HTTP 请求的 URI 后缀决定,参见:URI 后缀与媒体类型的对应关系

扩展参数解析器

自定义的 REST 资源默认支持的参数格式有:json。

JAX-RS 机制下,REST 资源表述生成器的扩展遵循 JAX-RS 标准。基于 javax.ws.rs.ext.MessageBodyReader 实现,通过@Provider 来标注使用自定义的 MessageBodyProvider,并使用@Consumes 指定媒体类型。

 

扩展过程跟现有 REST 资源扩展中的扩展表述生成器一致,参见:参数解析器扩展

注意:资源响应的媒体类型由 HTTP 请求的 URI 后缀决定,参见:URI 后缀与媒体类型的对应关系