我有一些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);
}
}
但MyResponse
是List<MyType>
的包装。
来自build
的{{1}}方法如下所示:
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);
}
@TypeHint(List.class)
@TypeHint(MyType.class)
- &gt;遗憾的是,由于Java类型擦除,这不起作用。问题:
是否有有效的替代3号?
即使类型为@TypeHint(List<MyType>.class)
,数字 1 也无用,因为我自己的类型必须使用List
进行注释,且@XmlRootElement
不可更改(它来自JDK)。
数字 2 有一个解决方法,但它并不完美:
在Javadoc中指定它是List
(例如:在List
字之后)(可以通过HTML标记使用粗体,颜色,斜体等强调)
例如:
@return
详细信息:
答案 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解决方法。