4

在 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);

是否有可能做到这一点?如果有怎么办?

4

2 回答 2

3

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

于 2011-07-07T02:14:27.490 回答
3

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

我认为这里的相关问题是您期望调用 requestJson() 的样子。一些例子:requestJson(1)andrequestJson("String")与类似的东西requestJson(null, 1)and 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) {...}
    

    (这类似于这里讨论的内容)

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

于 2011-07-07T02:22:53.833 回答