回到目录
Lesson 2:定制化manager bean
- 为了方便说明和截图,以下描述以Elipse工程为主。
- 如何导入Eclipse,请参见附录“导入为Eclipse工程”。
创建扩展的manager类文件
代码生成的目录结构,请参见“Code Generator 使用手册”(截止本文编写时,可以在这里获得)。

我们要写定制化的代码, 应该放在 “bank_custom_src”这个位置:

我们假设定制 “transaction”的manager,在eclipse里添加一个类即可:

-
source folder 应该选择 "xxx_custom_src"
-
package 命名应遵循一致的规范。这里为 com.demo.bank.transaction, 和要扩展的Manager使用相同的包名
-
类名应遵循一致的规范。这里为 TransactionCustomManagerImpl,
它的格式为:<类型>CustomManagerImpl。 ‘Custom’表示这是个定制化代码。
-
它继承了自动生成的manager:TransactionManagerImpl
点击‘finish’,生成一个空的类,在这个类里,可以自由的编写定制化代码而不会被生成的代码覆盖。

在spring配置文件中指定manager bean
打开项目的配置文件 xxx_custom.xml, 本例中就是:“bank_custom.xml”
它位于 xxx_custom_src/META-INF 下
这个文件中引用了 bank_manager.xml.
bank_manager.xml 中定义了所有的manager bean。本例中我们需要扩展的transaction manager的定义为
<bean id="transactionManagerBase"
class="com.demo.bank.transaction.TransactionManagerImpl"/>
<bean id="transactionManager"
class="com.demo.bank.transaction.TransactionManagerImpl"
parent="transactionManagerBase" >
</bean>
我们通过在 bank_custom.xml中重新定义transactionManager bean来覆盖bank_manager.xml中的定义
文件:bizcore/WEB-INF/bank_custom_src/META-INF/bank_custom.xml
<bean id="transactionManager"
class="com.demo.bank.transaction.TransactionCustomManagerImpl"
parent="transactionManagerBase" >
</bean>
重载checkAccess方法
简单起见,我们的教程中暂时忽略权限检查。将会有单独的一节来介绍checkAccess及其相关方法。
此处我们简单的重载并返回accessOK() 即可
package com.demo.bank.transaction;
import com.terapico.uccaf.BaseUserContext;
public class TransactionCustomManagerImpl extends TransactionManagerImpl {
@Override
public Object checkAccess(BaseUserContext baseUserContext,
String methodName, Object[] parameters)
throws IllegalAccessException {
return accessOK();
}
}
实现自己的函数
这次我们演示一个带参数的sayHello方法。
我们演示一个String类型的参数,另外还包括一个bool,一个Date,一个int参数。
在新建立的TransactionCustomManagerImpl.java中添加以下函数:
public Map<String, Object> sayHello(BankUserContext userContext, String message,
boolean alwaysSay, Date byEndOfMonth, int exclamationMark)
throws Exception {
// 将输入参数收集起来
Map<String, Object> inputParams = MapUtil.put("message", message)
.put("alwaysSay", alwaysSay)
.put("byEndOfMonth", byEndOfMonth)
.putIf(exclamationMark >=0, "exclamationMark", exclamationMark)
.into_map();
// 计算输入时间的‘月底’时间
Date endOfMonth = DateTimeUtil.standOn(byEndOfMonth).endOfMonth().endOfDay().getDate();
// 构造问候语
StringBuilder bMessage = new StringBuilder();
if (!alwaysSay && userContext.now().after(endOfMonth)) {
bMessage.append("太晚了,bye-bye world");
}else {
bMessage.append("Hello. ").append(message);
if (exclamationMark > 0) {
bMessage.append(TextUtil.repeat("!", exclamationMark, "."));
}else {
bMessage.append(".");
}
}
// 返回结果数据结构
return MapUtil.put("INPUT", inputParams).put("GREETING", bMessage.toString()).into_map();
}
说明:这个函数没有实际意义,不要纠结功能细节
- 参数 userContext 是每个接口函数的第一个参数。
- 参数message:是用户输入的问候语;
- 参数alwaysSay:是无论当前时间是否超过了用户输入的时间的‘月底’都用用户输入的问候语进行问候;
- 参数byEndOfMonth:是用户输入的时间
- 参数exclamationMark:是在问候语后面追加多少个问号。
调用定制接口
编译运行还是“gradle bootRun”。
根据lession 1的说明,我们可以得到新函数的调用URL为
http://localhost:8080/bank/transactionManager/sayHello/<arg1>/<arg2>/<arg3>/<arg4>/
以参数:message=“nice day”; alwaysSay=false; byEndOfMonth="2019-10-1"; exclamationMark=3 调用接口的URL为:
http://localhost:8080/bank/transactionManager/sayHello/nice+day/false/2019-10-1/3/
(注意参数的位置和书写格式)

以参数:message=“nice day”; alwaysSay=false; byEndOfMonth="2019-9-1"; exclamationMark=3 调用接口的URL为:
http://localhost:8080/bank/transactionManager/sayHello/nice+day/false/2019-9-1/3/
结果为:

这个例子向您展示了以下内容:
参数的传递
只要按照函数声明的顺序,在URL中以/分隔,填写各种参数即可。框架会将参数自动转换为对应的类型,然后调用对应的方法。
这里展示了几个常用的数据类型的书写格式:
- String:直接写参数值即可。 不需要双引号,只要符合URL规范即可。
- Boolean:直接写 true | false 即可
- Date:有很多种写法,平台会自动判断。目前支持以下几种
- yyyy-MM-dd'T'HH:mm:ss
- yyyy-MM-dd'T'HH:mm
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm
- yyyy-MM-dd
- int:直接写值
- 类似的,可以推断出其他数据类型也是直接写值就可以了。
目前不支持InetAddress,请使用String。
后续版本会考虑直接支持InetAddress这一类的需要特别构造的“常用类”
工具类的使用
例子函数中,使用了以下几个工具类:
在包“com.terapico.utils”中有很多工具类,帮助你方便的实现某些小功能。 这些工具类全部以源代码形式提供,可以查看代码,了解具体的功能。
获取结果
例子函数中,直接返回了一个Map对象。在上面的截图中可以看到,结果是 JSON 格式的字符串。这个是默认行为。
如果希望返回其他格式,可以在Header中设置“Accept”
| Accept取值 | 返回值格式 |
|---|---|
| application/javascript | JSONP |
| text/html | 用JSP渲染(注1) |
| application/json 或其他值 | JSON |
| 注1:目前使用JSP需要使用resin 3.1, 仅用于开发环境中的调试。 |
如需支持JSP,请参见附录:部署到resin-3.1
恭喜你!
恭喜你,您已经可以使用daas-start-kit完成基本的开发工作了。

