使用注释的Java命名/可选参数?

时间:2011-07-07 00:52:37

标签: java parameters annotations option named

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

有可能这样做吗?如果是这样的话?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

我有五种方法可以解决这个问题:

  1. 最不自动化的方式(但最终还是最好的方法):亲自编写变体方法或者设置IDE以生成它们。

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

  3. 拦截对requestJson()的调用并根据需要插入缺失的值(这会进入一些混乱的反射或运行时代码生成voodoo;这是可能的,但它不会很简单 - 基本上你正在构建你自己的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()中额外处理)。可以将锅炉板提取到库中。