DaaS 服务端 Java二次开发指南-Lesson 2:定制化manager bean

587 阅读5分钟

回到目录

Lesson 2:定制化manager bean

  • 为了方便说明和截图,以下描述以Elipse工程为主。
  • 如何导入Eclipse,请参见附录“导入为Eclipse工程”。

创建扩展的manager类文件

代码生成的目录结构,请参见“Code Generator 使用手册”(截止本文编写时,可以在这里获得)。

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

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

  1. source folder 应该选择 "xxx_custom_src"

  2. package 命名应遵循一致的规范。这里为 com.demo.bank.transaction, 和要扩展的Manager使用相同的包名

  3. 类名应遵循一致的规范。这里为 TransactionCustomManagerImpl,

    它的格式为:<类型>CustomManagerImpl。 ‘Custom’表示这是个定制化代码。

  4. 它继承了自动生成的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完成基本的开发工作了。

回到目录