【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
无
不论是早期8.0/9.0版本中的Service接口,还是10.0最初版本中的HttpHandlerProvider接口。开发插件时都需要开发者自己编写大量的请求和响应的处理逻辑以及权限逻辑,使用还是相对繁琐的。在10.0中帆软已经引入了spring的框架,那么对于熟知spring框架的开发者肯定也希望能使用spring的方式来开发web接口了。为此,官方团队提供了一个插件中能够使用spring相关注解来开发web服务的接口。
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(); }
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"; } }
产品线 | 版本 | 支持情况 | 备注 |
---|---|---|---|
FR | 10.0 | 支持 | |
BI | 5.1 | 支持 | |
BI | 5.1.2 | 支持 | |
BI | 5.1.3 | 支持 |
<extra-decision> <ControllerRegisterProvider class="your class name"/> </extra-decision>
插件服务模块(PluginControllerActivator)在加初始化时,会通过PluginControllerManager#init方法读取到所有插件中申明的注册实例。并注入到SpringControllerHandler中经由registerController生效。
该接口需要配合相关的注解才能生效(比如上文的HelloWorld.java)。插件中该接口常用的注解列表如下:
类型 | 名称 | 描述 | 说明 |
---|---|---|---|
产品自定义注解 | @DecisionConfigRecord | 用来修饰Conf类型,描述该conf配置的资源是什么,以及可以进行的操作。该注解在webServiceUtil中使用到,当对属性值进行设置时,通过该注解进行日志记录,并保存到fine_record_operate表中。 |
|
【常用】@DecisionCacheRefresh | 当请求执行具体的业务逻辑前,如果需要使用相关缓存的,可以用该注解实现缓存的刷新。 注:此注解生效的前提是,缓存类实现了DecisionLoadingCache接口,且通过 DecisionCacheProxy.getInstance().getDecisionCacheManager().registerCache( your_cache );提前注册到管理对象中 |
| |
@DecisionControllerLog | 该注解描述该方法的执行过程需要进行日志记录,包括该方法的类型、项目以及所执行的操作。配合DecisionLogAspect切面使用,标识被该注解修饰的方法为aop的切入点,并通过PointCut提供空方法,对原方法进行增强,增加日志功能。 |
| |
@DecisionEntryChecker | 该注解描述该方法或参数需要进行权限验证。配合DecisionAuthorityAspect切面使用。 |
| |
@DecisionServiceLog | 这个没看到有啥用,应该是用来对Service端进行日志增强。 |
| |
@DecisionUserChecker | 该注解描述该方法或参数需要进行用户角色验证。同样配合DecisionAuthorityAspect切面使用。 |
| |
@DecisionBinding | 自动绑定首次登录设备。同样是配合DeviceBindingAspect切面使用。提供登录前验证设备绑定以及成功登录后绑定设备增强。 |
| |
@FinePathVariable | 平台自定义的PathVariable,与SpringMVC中PathVariable类似,将url中的{xxx}占位符绑定到修饰的参数中,并且平台提供了一个该注解的解析器FinePathVariableResolve。 |
| |
@FunctionSupport | lic功能点判断,被修饰的类在调用之前需要判断是否在lic文件中注册了指定的功能。 |
| |
【常用】@Lock | 该注解修饰的方法在调用时,为了保证并发时数据的一致性,会对configuration对象进行锁操作。 |
| |
【常用】@LoginStatusChecker | 该注解描述方法的调用是否需要进行登录状态。并且指定了两个属性,Token令牌的来源以及是否需要验证。默认需要验证。 插件中申明的Controller如果不主动申明@LoginStatusChecker(required = false),默认这个controller是需要用户登录才能访问的 |
| |
@TemplateAuth | 模板权限控制,还没有看到有地方用到这个注解。但是在DecisionInterceptor拦截器中对该注解进行了操作。 |
| |
【常用】@VisitRefer | 描述该方法在资源访问时是否需要进行权限验证,以及权限验证所使用的模块。 |
| |
spring注解 | @Controller | SpringMCV中标识该类为一个Controller控制器,用来处理dispatch分发过来的请求 注:使用该注解时,因为是可以缺省value名称的,如果是缺省名称时,必须要保证你的类命不与当前产品和其他插件中的任何一个组件名称重复,否则后注册的会覆盖掉先注册的!所以建议value不要缺省,且使用一个不易重复的值作为组件名称 |
|
@RequestMapping | 地址映射注解,用于类或者方法上,用于类上标明该类中的方法处理的请求的路径的都是以改地址作为前缀。其中有一些属性值可以指定映射规则,例如只处理某种方法的请求,只处理包含某特定字符的请求等。 |
| |
@ResponseBody | 该注解用于将Controller的方法返回的对象,根据HTTP Request Header的Accept的内容,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。 | ||
@PathVariable | 将{xxx}中的内容绑定到修饰的参数中 |
| |
@RequestBody | 处理content-type不是默认的application/x-www-form-urlcoded编码的内容,例如application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。可以直接将json中的内容绑定到修饰的bean中。 | ||
@RequestParameter | 将请求中的参数绑定到修饰的参数中,类似于request.getParameter(),可以通过设置defaultValue属性设定默认值。 |
|
demo地址:demo-controller-register
免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。禁止用于任何商业用途,若作为商用一切后果责任由使用者自行承担。