Это не представляется возможным на момент этого ответа.Ближайшие возможности, которые я нашел:
io.swagger.converter.ModelConverters
: метод read()
создает Model
объектов, но член example
в этих моделях равен нулю.Примеры присутствуют в элементе properties
в строковой форме (взятом непосредственно из аннотаций APIModelParameter).
io.swagger.codegen.examples.ExampleGenerator
: метод resolveModelToExample()
получает выходные данные из ModelConverters.read()
и генерирует карту, представляющую объект с его свойствами (в то же время анализируя не строковые свойства, такие как вложенные модели).Этот метод используется для сериализации в JSON.К сожалению, resolveModelToExample()
является приватным.Если бы он был общедоступным, код для создания модели по умолчанию для аннотированного класса модели Swagger API мог бы выглядеть следующим образом:
protected <T extends AbstractModel> T getModelExample(Class<T> clazz) {
// Get the swagger model instance including properties list with examples
Map<String,Model> models = ModelConverters.getInstance().read(clazz);
// Parse non-string example values into proper objects, and compile a map of properties representing an example object
ExampleGenerator eg = new ExampleGenerator(models);
Object resolved = eg.resolveModelToExample(clazz.getSimpleName(), null, new HashSet<String>());
if (!(resolved instanceof Map<?,?>)) {
// Model is not an instance of io.swagger.models.ModelImpl, and therefore no example can be resolved
return null;
}
T result = clazz.newInstance();
BeanUtils.populate(result, (Map<?,?>) resolved);
return result;
}
Поскольку в нашем случае нам нужны только свойства String, boolean и int, есть, по крайней мере, возможность самостоятельно анализировать аннотации сумасшедшим хакерским способом:
protected <T extends MyModelBaseClass> T getModelExample(Class<T> clazz) {
try {
T result = clazz.newInstance();
for(Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(ApiModelProperty.class)) {
String exampleValue = field.getAnnotation(ApiModelProperty.class).example();
if (exampleValue != null) {
boolean accessible = field.isAccessible();
field.setAccessible(true);
setField(result, field, exampleValue);
field.setAccessible(accessible);
}
}
}
return result;
} catch (InstantiationException | IllegalAccessException e) {
throw new IllegalArgumentException("Could not create model example", e);
}
}
private <T extends MyModelBaseClass> void setField(T model, Field field, String value) throws IllegalArgumentException, IllegalAccessException {
Class<?> type = field.getType();
LOGGER.info(type.toString());
if (String.class.equals(type)) {
field.set(model, value);
} else if (Boolean.TYPE.equals(type) || Boolean.class.equals(type)) {
field.set(model, Boolean.parseBoolean(value));
} else if (Integer.TYPE.equals(type) || Integer.class.equals(type)) {
field.set(model, Integer.parseInt(value));
}
}
Я мог бы открытьпроблема / PR на Github позже, чтобы предложить добавить функциональность в Swagger.Я очень удивлен, что никто другой, похоже, не запрашивал эту функцию, учитывая, что наш сценарий использования отправки образцов экземпляров модели в API в качестве теста должен быть обычным явлением.