11

我有一些 REST 服务(使用和生成应用程序/json)并@TypeHint用于生成文档。

现在我有这样的事情:

import javax.ws.rs.core.Response;
...

@Path("/path")
public class MyClass {

    @GET
    @TypeHint(MyResponse.class)
    public Response getIt() {

        MyResponse resp = ... ;
        return MyBuilder.build(resp);
    }
}

但是MyResponse是一个包装List<MyType>

我的build方法MyResponse看起来像这样:

public static Response build(Serializable payload) {
    return Response.ok(msr).header(...).build();
}

我想直接使用List<MyType>而不是MyResponse. TypeHint在以下代码中使用哪种方法最好?

    @GET
    @TypeHint(/* TODO */)
    public Response getIt() {

        List<MyType> myList = ... ;
        return MyBuilder.build(myList);
    }

我在考虑以下选项:

  1. @TypeHint(List.class)
  2. @TypeHint(MyType.class)
  3. @TypeHint(List<MyType>.class)-> 不幸的是,由于 Java 类型擦除,这不起作用。

问题:

3 号有有效的替代方案吗?


即使类型是 a List,数字1也没有用,因为我自己的类型必须使用注释@XmlRootElement并且是不可List更改的(它来自 JDK)。

数字2有一个解决方法,但它不是很完美:

  • 使用数字 2(只是为了在生成的 HTML 文档中有一个可用的示例 - 对该列表中包含的元素的描述)
  • 在 Javadoc 中指定它是 a List(例如:在@return单词之后)(可以通过 HTML 标记使用粗体、颜色、斜体等强调)

    例如:

    /**
     * ...
     * @return <strong><font color="blue">List&lt;MyType&gt;</font></strong>
     */
    

细节:

  • 发音.version = 1.30.1
  • 爪哇 7
4

2 回答 2

5

在使用 TypeHint 而不是 List.class 时,我选择使用 MyType[].class。这样,文档将声明“MyType 数组”,这对于我的带有 json 的 rest-api 来说是正确的。

@TypeHint(value = MyType[].class)
于 2016-01-19T10:24:52.143 回答
1

如您所知, TypeHint用于向 Enunciate 提供有关 JAX-RS资源方法返回接受什么作为输入参数的提示。

在您的情况下,正在描述返回类型。

我假设 ClassReturnedByMyBuildersBuildMethod 是 javax.ws.rs.core.Response 抽象类的子类。对于您展示的代码,您需要使用的是 MyBuilder 的构建方法返回的类 - @TypeHint(ClassReturnedByMyBuildersBuildMethod.class)

选项 2 @TypeHint(MyType.class) 没有意义。它不是返回类型也不是输入参数。

更新 1:通过您的解决方法,它可能有意义:)

如果您将输入参数添加到 getIt 方法 - 类似于public Response getIt(List<MyType> myList){...您将使用选项 1( @TypeHint(List.class)),因为您知道org.codehaus.enunciate.jaxrs.TypeHint注释类型元素声明具有Class返回类型 ( Class<?> value();),并且您不能使用参数化类型是因为泛型类型的擦除(在这种情况下,参数化类型在运行时共享同一个类 - List)。

但是将输入参数更改getIt(List<MyType> myList) 为可能不可行,因为必须从 URI 获取列表(使用 javax.ws.rs 的 @QueryParam 或 @Context UriInfo )。这个问题解决了使用参数列表作为输入时的最佳实践(如果它可能与您有关)。

更新 2:由于您的 XmlRootElement 约束,选项 1 变得不太可行。

更新 3:我没有看到使用 TypeHint 注释的选项 3 的有效替代方法。

您将不得不使用自定义选项 2 解决方法。

于 2015-06-03T13:59:22.357 回答