【问题标题】:Java named/optional parameters using annotation?使用注释的Java命名/可选参数?
【发布时间】:2011-09-30 02:05:42
【问题描述】:

在 RESTeasy 这个...

@GET
@Path("request")
public String requestJson(@QueryParam("arg1") @DefaultValue("") String arg1,
                          @QueryParam("arg2") @DefaultValue("0") Integer arg2);

...允许您定义方法签名中定义的任何参数子集。当然可以在任何方法签名上使用相同的模式,如下所示:

@Method
public String requestJson(@OptionalParameter("arg1") @DefaultValue("") String arg1,
                          @OptionalParameter("arg2") @DefaultValue("0") Integer arg2);

可以这样做吗?如果有怎么办?

【问题讨论】:

  • 注释(来自 JSR311,顺便说一句)只是告诉容器(在这种情况下为 RESTeasy)如果参数为 null 则注入一个值,这与可选的命名参数非常不同,后者不是Java 支持的东西。

标签: java parameters annotations option named


【解决方案1】:

RESTEasy 示例中的注释是可能的,因为对象由 RESTEasy 框架管理。它可以检查方法并根据这些注释确定如何调用它。可以创建任何你想要的注解,关键是调用方法的代码需要知道注解以及如何处理它们。

【讨论】:

    【解决方案2】:

    首先,@laz 所说的完全正确。这在 RESTEasy 中是可能的,因为 RESTEasy 正在管理对您的类的调用。

    我认为这里的相关问题是您期望调用 requestJson() 的样子。一些例子:requestJson(1)requestJson("String")requestJson(null, 1)requestJson("String", null) 之类的东西。

    我可以想到五种方法来处理这个问题:

    1. 自动化程度最低的方式(但最终是最好的方式):自己编写变体方法,或者设置您的 IDE 来生成它们。

    2. 如果没有默认值,则将其设置为调用者的责任(即调用者确定“我正在调用具有”的方法

    3. 拦截对 requestJson() 的调用并根据需要插入缺失的值(这会导致一些混乱的反射或运行时代码生成巫毒;这是可能的,但不会很简单——基本上你正在构建您自己的 AOP 库,它将管理对 requestJson()) 的所有调用。

    4. 插件到编译器/构建链以生成所需的方法,即:

      public String requestJson() { requestJson("", 0); }
      public String requestJson(String arg1) { requestJson(arg1, 0); }
      public String requestJson(Int arg2) { requestJson("", arg2); }
      public String requestJson(String arg1, Int arg2) {...}
      

      (这类似于discussed here

    5. 将确定缺失值的代码添加到 requestJson 实现的顶部。这只会启用像requestJson(null, 1) 这样的东西,它可能不是你想要的(因为它需要额外提交requestJson())。可以将样板提取到库中。

    【讨论】:

    • 感谢您的回复。事实上,我之前已经考虑过您在此处提到的大多数方法。我想我希望看到'requestJson'被调用的方式就像'@method requestJson(@param({name="arg1",value="1"})'注释'@method'可以反映方法它包装,提取方法签名中的参数数量,然后根据任何缺少的参数在内部重载该方法,然后将任何“@param”注释中定义的值拉入要传递给重载的方法。方法可以反映在这边?
    • 您使用的语法似乎在调用方法时有注释,无法编译。
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 2021-12-21
    • 1970-01-01
    • 2010-11-10
    • 2018-09-14
    • 1970-01-01
    • 2018-11-29
    • 2014-08-16
    相关资源
    最近更新 更多