在Enunciate

时间:2015-04-27 11:13:41

标签: java annotations type-hinting code-documentation enunciate

我有一些REST服务(使用和生成application / 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);
    }
}

MyResponseList<MyType>的包装。

来自build的{​​{1}}方法如下所示:

MyResponse

我想直接使用public static Response build(Serializable payload) { return Response.ok(msr).header(...).build(); } 代替List<MyType>。在以下代码中使用MyResponse的最佳方法是什么?

TypeHint

我正在考虑以下选项:

  1. @GET @TypeHint(/* TODO */) public Response getIt() { List<MyType> myList = ... ; return MyBuilder.build(myList); }
  2. @TypeHint(List.class)
  3. @TypeHint(MyType.class) - &gt;遗憾的是,由于Java类型擦除,这不起作用。
  4. 问题:

    是否有有效的替代3号

    即使类型为@TypeHint(List<MyType>.class),数字 1 也无用,因为我自己的类型必须使用List进行注释,且@XmlRootElement不可更改(它来自JDK)。

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

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

      例如:

      @return

    详细信息:

    • enunciate.version = 1.30.1
    • Java 7

2 个答案:

答案 0 :(得分:4)

在使用TypeHint而不是List.class时,我选择使用MyType [] .class。通过这种方式,文档将声明“myType数组”,对于我的rest-api,json是真的。

@TypeHint(value = MyType[].class)

答案 1 :(得分:2)

如您所知 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<?> value();),并且您不能使用参数化类型,因为删除泛型类型(参数化类型共享同一个类)在这种情况下运行时 - 列表)。

但是将输入参数更改为getIt(List<MyType> myList) 可能不可行因为列表必须从URI获取(使用javax.ws.rs&#39; @QueryParam或@Context UriInfo)。 This question解决了使用参数列表作为输入的最佳做法,如果它可能与您有关。

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

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

您必须使用自定义选项2解决方法。