Ответ 1
Я выбрал использование класса MyType [] при использовании TypeHint вместо List.class. Таким образом, в документации будет указано "массив MyType", который для моего rest-api с json является истинным.
@TypeHint(value = MyType[].class)
У меня есть некоторые службы 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);
}
Я думал о следующих вариантах:
@TypeHint(List.class)
@TypeHint(MyType.class)
@TypeHint(List<MyType>.class)
→ К сожалению, это не работает из-за стирания стилей Java.Вопрос:
Существует ли допустимая альтернатива для номера 3?
Даже если тип List
, число 1 не полезно, потому что мой собственный тип должен быть аннотирован с помощью @XmlRootElement
и что List
неизменен (это от JDK).
Существует обходной путь для числа 2, но он не совсем совершенен:
Укажите, что это символ List
в Javadoc (например: после слова @return
) (его можно выделить жирным шрифтом, цветами, курсивом и т.д. с помощью HTML-тегов)
Например:
/**
* ...
* @return <strong><font color="blue">List<MyType></font></strong>
*/
Детали:
Я выбрал использование класса MyType [] при использовании TypeHint вместо List.class. Таким образом, в документации будет указано "массив MyType", который для моего rest-api с json является истинным.
@TypeHint(value = MyType[].class)
Как вы знаете, TypeHint используется, чтобы дать Enunciate подсказку о том, что возвращает метод ресурса JAX-RS или в качестве входного параметра.
В вашем случае описывается тип возврата.
Я предполагаю, что классReturnedByMyBuildersBuildMethod является подклассом абстрактного класса 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();
), и вы не можете использовать параметризованный тип beacuse для стирания родовых типов (в этом случае параметризованный тип имеет один и тот же класс во время выполнения - List).
Но изменение входного параметра на getIt(List<MyType> myList)
, вероятно, не является жизнеспособным, потому что список должен быть получен из URI (с javax.ws.rs @QueryParam или @Context UriInfo). Этот вопрос описывает лучшие практики при использовании списка параметров в качестве входных данных, если это может вас беспокоить.
Обновление 2: Вариант 1 становится менее жизнеспособным из-за вашего ограничения XmlRootElement.
Обновление 3: я не вижу действительной альтернативы для варианта 3, используя аннотацию TypeHint как таковой.
Вам понадобится использовать обходной вариант 2.