【发布时间】:2019-12-14 18:28:19
【问题描述】:
我正在尝试使用 ballerina(MacOS Catalina 上的 jBallerina-1.0.5)实现一个简单的注释处理器。在这个例子中,我需要:
- 遍历给定
service的可用resource函数 - 对于每次迭代,获取给定
@annotation的值,如resource中注释的那样
举个例子:
...
service my_service on new http:Listener(8080) {
@my_annonatation {
value: "my-value-for-resource-1"
}
resource function my_resource_1() {}
@my_annonatation {
value: "my-value-for-resource-2"
}
resource function my_resource_2() {}
}
根据上面的service代码sn-p,我需要得到resource名称为["my_resource_1", "my_resource_2"]和@annotation值my-value-for-resource-1,my-value-for-resource-2对应my_resource_1和my_resource_2。
我的问题是:
- 如何使用芭蕾舞演员在给定的
service中定义resources - 我已经尝试使用
function getServiceAnnotations(service serviceType, string annotName, string? moduleName = ()) returns any的ballerina/reflect模块来获取@annotation值。但它没有给出任何回报(显然它返回一个空字符串或可能为空)。
除了旧的 ballerina 0.x pre-releases 1 之外,我没有看到任何关于 ballerina 注释处理的好文章。我发现 ballerina/reflect 模块现在已更新 2 3,因为我与芭蕾舞演员的源代码进行了比较(但在芭蕾舞演员的发布说明 4 中没有提到)。
还有文章“Extending Ballerina”5 提到了另一种通过编译器扩展进行注释处理的方法,该方法将操作委托给 Java。但是,我们将 Java 依赖项推送到 ballerina central 有一个限制。
请建议我一个解决方法以获得预期的结果,非常感谢纯芭蕾舞演员语言的代码。
参考文献
【问题讨论】:
-
请参考这里我们如何读取资源和服务注解,并将注解转换为它的记录类型。然后使用记录的类型可以得到注解github.com/wso2/product-microgateway/blob/jballerina/components/…的值
-
@RajithRoshan 你在现场!,我指的是微网关源代码并在本地成功编译,包括包含注释处理操作的微网关核心。我发现微网关使用不同版本的 Ballerina,
ballerina/reflect模块现已更新。我正在 jballerina-1.0.5 上进行测试。
标签: wso2 annotation-processing ballerina