Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中声明自定义可配置应用程序的配置?_Java_Text_Configuration_Configuration Management_Design Decisions - Fatal编程技术网

在java中声明自定义可配置应用程序的配置?

在java中声明自定义可配置应用程序的配置?,java,text,configuration,configuration-management,design-decisions,Java,Text,Configuration,Configuration Management,Design Decisions,因此,对于我的一个爱好项目,我想创建一个应用程序,在两个服务之间转换HTTP调用和请求 应用程序根据用户可以设置的配置来执行此操作。其思想是应用程序侦听传入的API调用,转换调用,然后转发它 然后应用程序等待响应,然后转换响应并将其发送回调用方 转换可以简单到重命名主体对象中的字段值或将标题字段替换为主体 我认为翻译应该从映射正确的URL开始,因此下面是一个我认为配置应该是什么样的示例: //request mapping incoming URL = outgoing URL(

因此,对于我的一个爱好项目,我想创建一个应用程序,在两个服务之间转换HTTP调用和请求

应用程序根据用户可以设置的配置来执行此操作。其思想是应用程序侦听传入的API调用,转换调用,然后转发它

然后应用程序等待响应,然后转换响应并将其发送回调用方

转换可以简单到重命名主体对象中的字段值或将标题字段替换为主体

我认为翻译应该从映射正确的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)易于在用户手册中记录。

我将尝试使用此解决方案,如果我能完成项目,我将使其开源!我很欣赏这个写得很好的解决方案!