【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 6 Current »

一、特殊名词介绍

二、背景、场景介绍

不论是早期8.0/9.0版本中的Service接口,还是10.0最初版本中的HttpHandlerProvider接口。开发插件时都需要开发者自己编写大量的请求和响应的处理逻辑以及权限逻辑,使用还是相对繁琐的。在10.0中帆软已经引入了spring的框架,那么对于熟知spring框架的开发者肯定也希望能使用spring的方式来开发web接口了。为此,官方团队提供了一个插件中能够使用spring相关注解来开发web服务的接口。

三、接口介绍

ControllerRegisterProvider.java
package com.fr.decision.fun;

import com.fr.stable.fun.mark.Mutable;

/**
 * @author: Maksim
 * @Date: Created in 2019-08-10
 * @Description: Controller热部署接口
 */
public interface ControllerRegisterProvider extends Mutable {

    String XML_TAG = "ControllerRegisterProvider";

    int CURRENT_LEVEL = 1;

    Class<?>[] getControllers();

}

HelloWorld.java
package com.tptj.demo.hg.controller.register;

import com.fr.decision.webservice.annotation.LoginStatusChecker;
import com.fr.third.springframework.stereotype.Controller;
import com.fr.third.springframework.web.bind.annotation.RequestMapping;
import com.fr.third.springframework.web.bind.annotation.ResponseBody;

/**
 * @author 秃破天际
 * @version 10.0
 * Created by 秃破天际 on 2021-03-24
 * http://localhost:8075/webroot/decision/hello/world
 **/
@Controller
@LoginStatusChecker(required = false)
public class HelloWorld {

    @RequestMapping(value = "/hello/world")
    @ResponseBody
    public String hello()throws Exception{
        return "Hello World";
    }
}


四、支持版本

产品线

版本

支持情况

备注

FR10.0支持
BI5.1支持
BI5.1.2支持
BI5.1.3支持

五、插件注册

plugin.xml
<extra-decision>
    <ControllerRegisterProvider class="your class name"/>
</extra-decision>

六、原理说明

插件服务模块(PluginControllerActivator)在加初始化时,会通过PluginControllerManager#init方法读取到所有插件中申明的注册实例。并注入到SpringControllerHandler中经由registerController生效

七、特殊限制说明

该接口需要配合相关的注解才能生效(比如上文的HelloWorld.java)。插件中该接口常用的注解列表如下:

类型名称描述说明
产品自定义注解@DecisionConfigRecord用来修饰Conf类型,描述该conf配置的资源是什么,以及可以进行的操作。该注解在webServiceUtil中使用到,当对属性值进行设置时,通过该注解进行日志记录,并保存到fine_record_operate表中。
  • type,模块名称,默认值Dec-Manage_PlatformModule
  • item,设置项,默认值Dec-Basic_Login
  • Resource,被访问资源,默认空
  • operateType,行为类型,如果行为类型为OPEN_CLOSE,则解析为open/close,为UPDATE,则解析为update,OTHER则根据operateValue指定,默认OPEN_CLOSE
  • opereteValue,行为值(只在operateType为OTHER时有效),默认空
【常用】@DecisionCacheRefresh

当请求执行具体的业务逻辑前,如果需要使用相关缓存的,可以用该注解实现缓存的刷新。

注:此注解生效的前提是,缓存类实现了DecisionLoadingCache接口,且通过

DecisionCacheProxy.getInstance().getDecisionCacheManager().registerCache( your_cache );提前注册到管理对象中

  • cacheClass,缓存类的class。
@DecisionControllerLog该注解描述该方法的执行过程需要进行日志记录,包括该方法的类型、项目以及所执行的操作。配合DecisionLogAspect切面使用,标识被该注解修饰的方法为aop的切入点,并通过PointCut提供空方法,对原方法进行增强,增加日志功能。
  • type,控制器操作的模块名称
  • item,控制器操作的具体设置项
  • operate,采取了哪些操作
@DecisionEntryChecker

该注解描述该方法或参数需要进行权限验证。配合DecisionAuthorityAspect切面使用。

  • authorityType,权限类型数组,用来查询用户是否具有指定的权限。
  • targetIndex,目标参数的下标
@DecisionServiceLog这个没看到有啥用,应该是用来对Service端进行日志增强。
  • resource,访问源
  • details,详细描述
@DecisionUserChecker

该注解描述该方法或参数需要进行用户角色验证。同样配合DecisionAuthorityAspect切面使用。

  • roleCheckerType,角色校验类型,RoleCheckerType的枚举类型,具有NONE、USER、DEPARTMENT、CUSTORM_ROLE四个值,表示该用户是否具有管理{用户,部门,自定义角色}的权限

  • targetIndex,目标参数的下标
@DecisionBinding自动绑定首次登录设备。同样是配合DeviceBindingAspect切面使用。提供登录前验证设备绑定以及成功登录后绑定设备增强。
  • autoBindFirstDevice,是否自动绑定首次登录设备,默认false

@FinePathVariable

平台自定义的PathVariable,与SpringMVC中PathVariable类似,将url中的{xxx}占位符绑定到修饰的参数中,并且平台提供了一个该注解的解析器FinePathVariableResolve。

  • value,被绑定的参数的参数名称
@FunctionSupport

lic功能点判断,被修饰的类在调用之前需要判断是否在lic文件中注册了指定的功能。

  • function,一个VT4FR对象,该对象里的属性表示功能模块,需要在lic中注册。例如function=VT4FR.FsBI,表示该函数的调用需要在lic中注册过FsBI。
【常用】@Lock该注解修饰的方法在调用时,为了保证并发时数据的一致性,会对configuration对象进行锁操作。
  • value,上锁的对象,是一个CLass<extends Configuration>类型。
【常用】@LoginStatusChecker

该注解描述方法的调用是否需要进行登录状态。并且指定了两个属性,Token令牌的来源以及是否需要验证。默认需要验证。

插件中申明的Controller如果不主动申明@LoginStatusChecker(required = false),默认这个controller是需要用户登录才能访问的

  • tokenResource,登录需要用到的token来源。默认TokenResource.HEADER,请求头中的token
  • required,资源访问是否需要本次登录校验。默认需要
@TemplateAuth模板权限控制,还没有看到有地方用到这个注解。但是在DecisionInterceptor拦截器中对该注解进行了操作。
  • product,模板产品类型,默认

    TemplateProductType.FINE_REPORT,及FineReport类型。

【常用】@VisitRefer

描述该方法在资源访问时是否需要进行权限验证,以及权限验证所使用的模块。

常用module值

  • refer,资源访问需要用到的模板权限,方法注解大于类注解,并且模块之间权限取并集
  • required,资源访问是否需要校验,默认需要









spring注解

@Controller

SpringMCV中标识该类为一个Controller控制器,用来处理dispatch分发过来的请求

注:使用该注解时,因为是可以缺省value名称的,如果是缺省名称时,必须要保证你的类命不与当前产品和其他插件中的任何一个组件名称重复,否则后注册的会覆盖掉先注册的!所以建议value不要缺省,且使用一个不易重复的值作为组件名称

  • value,组件名称
@RequestMapping地址映射注解,用于类或者方法上,用于类上标明该类中的方法处理的请求的路径的都是以改地址作为前缀。其中有一些属性值可以指定映射规则,例如只处理某种方法的请求,只处理包含某特定字符的请求等。
  • value,指定请求的实际地址,指定的地址可以是URI Template 模式;
  • method,指定请求的method类型, GET、POST、PUT、DELETE等;
  • consumes,指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
  • produces,指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
  • params,指定request中必须包含某些参数值是,才让该方法处理。
  • headers,指定request中必须包含某些指定的header值,才能让该方法处理请求。
@ResponseBody该注解用于将Controller的方法返回的对象,根据HTTP Request Header的Accept的内容,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
@PathVariable将{xxx}中的内容绑定到修饰的参数中
  • value,被绑定的参数的参数名称
@RequestBody处理content-type不是默认的application/x-www-form-urlcoded编码的内容,例如application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。可以直接将json中的内容绑定到修饰的bean中。
@RequestParameter将请求中的参数绑定到修饰的参数中,类似于request.getParameter(),可以通过设置defaultValue属性设定默认值。
  • defaultValue ,设置被绑定参数的默认值
  • required ,通过boolean设置是否是必须要传入的参数
  • value ,值表示接受的传入的参数类型

八、常用链接

demo地址:demo-controller-register

常用module值

(1)、三组开放web服务接口的插件接口对比

九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。禁止用于任何商业用途,若作为商用一切后果责任由使用者自行承担。

open-JSD-8016

open-JSD-7843

open-JSD-7747



  • No labels