在java中声明自定义可配置应用程序的配置?
因此,对于我的一个爱好项目,我想创建一个应用程序,在两个服务之间转换HTTP调用和请求 应用程序根据用户可以设置的配置来执行此操作。其思想是应用程序侦听传入的API调用,转换调用,然后转发它 然后应用程序等待响应,然后转换响应并将其发送回调用方 转换可以简单到重命名主体对象中的字段值或将标题字段替换为主体 我认为翻译应该从映射正确的URL开始,因此下面是一个我认为配置应该是什么样的示例:在java中声明自定义可配置应用程序的配置?,java,text,configuration,configuration-management,design-decisions,Java,Text,Configuration,Configuration Management,Design Decisions,因此,对于我的一个爱好项目,我想创建一个应用程序,在两个服务之间转换HTTP调用和请求 应用程序根据用户可以设置的配置来执行此操作。其思想是应用程序侦听传入的API调用,转换调用,然后转发它 然后应用程序等待响应,然后转换响应并将其发送回调用方 转换可以简单到重命名主体对象中的字段值或将标题字段替换为主体 我认为翻译应该从映射正确的URL开始,因此下面是一个我认为配置应该是什么样的示例: //request mapping incoming URL = outgoing URL(
//request mapping
incoming URL = outgoing URL(
//Rename header value
header.someobject.renameto = "somevalue"
//Replace body object to header
body.someobject.replaceto.header
)
我认为配置应该放在一个.txt文件中,由应用程序读取
我的问题是,是否有其他类似的系统将配置文件用于这样的配置?还有其他/更好的方法来声明配置吗?我在不同的上下文中做了类似的事情(从输入规范生成代码),因此我将概述我所做的工作,以供思考。我使用了Config4*(披露:我开发了它)。如果您对下面描述的方法感兴趣,那么我建议您阅读的第2章和第3章,以了解Config4*语法和API的概述。或者,用不同的配置语法(如XML)表达以下概念 Config4*是一种配置语法,与本讨论相关的语法子集如下:
# this is a comment
name1 = "simple value";
name2 = ["a", "list of", "values"];
# a list can be laid out in columns to simulate a table of information
name3 = [
# item colour
#------------------
"car", "red",
"jeans", "blue",
"roses", "red",
];
在一个代码生成器应用程序中,我使用一个表来提供规则,以指定如何生成代码以将值分配给消息字段。如果没有为特定字段指定规则,则某些内置规则提供默认行为。该表类似于以下内容:
field_rules = [
# wildcarded message.field instruction
#----------------------------------------------------------------
"Msg1.username", "@config:username",
"Msg1.password", "@config:password",
"Msg3.price", "@order:price",
"*.account", "@string:foobar",
"*.secondary_account", "@ignore",
"*.heartbeat_interval", "@expr:_heartbeatInterval * 1000",
"*.send_timestamp", "@now",
];
当我的代码生成器想要生成代码来为字段赋值时,代码生成器构造了一个字符串,其格式为“
,例如,Msg3.price
。然后它逐行(从顶部开始)检查字段规则表,以找到第一列与匹配的行。匹配逻辑允许*
作为通配符,可以匹配零个或多个字符。(为了方便起见,Config4*提供了提供此功能的patternMatch()
实用程序操作。)
如果找到匹配项,则指令
列中的值告诉代码生成器要生成哪种代码。(如果未找到匹配项,则使用内置规则,如果未应用任何规则,则不会为字段生成代码。)
每个指令都是一个字符串,格式为“”@:可选,参数“
。它被标记为提供关键字和可选参数。关键字被转换为enum
,并驱动开关
语句生成代码。例如:
@config:username
指令指定代码应为
生成以在运行时分配用户名
变量的值
将配置文件添加到该字段
@order:price
指令指定应生成代码
将调用orderObj->getPrice()
返回的值分配给字段
@string:foobar
指令指定了字符串文本foobar
应分配给该字段
@expr:_heartbeatInterval*1000
指令指定代码应
被生成以分配表达式的值\u heartbeatInterval*1000
到野外去
@ignore
指令指定不应为生成代码
为字段指定一个值
@now
指令指定应生成代码以分配
该字段的当前时钟时间
我在几个项目中使用了上述技术,每次我都根据特定项目的需要编写了说明。如果您决定使用这种技术,那么显然您需要发明指令来指定运行时翻译,而不是生成代码的指令。另外,不要觉得必须将所有基于翻译的配置都塞进一个表中。例如,您可以使用一个表来提供源URL->目标URL映射,使用另一个表来提供翻译消息中字段的说明
如果这种技术对您的效果和我在项目中的效果一样好,那么最终您的翻译应用程序将成为一个“引擎”,其行为完全由一个配置文件驱动,实际上,该文件是一种DSL(领域特定语言)。该DSL文件可能非常紧凑(少于100行),并且将成为用户可见的应用程序的一部分。因此,使DSL尽可能直观和易于阅读/修改是值得投资的,因为这样做将使翻译应用程序:(1)用户友好,(2)易于在用户手册中记录。我将尝试使用此解决方案,如果我能完成项目,我将使其开源!我很欣赏这个写得很好的解决方案!