У меня была похожая проблема, когда я хотел добавить собственный преобразователь аргументов, который преобразовывал бы строковое значение переменной пути в верхний регистр.Я решил это, создав GenericConverter
, который преобразовал строку string => string для переменных пути, аннотированных определенной аннотацией.
Тип аннотации переменной пути был просто аннотацией тегирования, подобной этой:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Uppercase {
String value() default "";
}
, который использовался для отображения контроллера покоя, подобного этому
@PostMapping(value = "/clients/{clientId}/postalAddress")
@ResponseStatus(HttpStatus.CREATED)
public IdResponse create(
@PathVariable("clientId") @Uppercase final String clientId,
@RequestBody @NotNull @Valid final AddressRequest request) {...}
А затем был запущен универсальный конвертер для запуска на любом аргументе String, а метод convert проверил, что аргумент был помечен Uppercase
аннотация, чтобы знать, если это должно быть в верхнем регистре.Это также означало, что Swagger API по-прежнему сообщает о переменной пути как о пути и правильно извлекает значение переменной пути, а затем запускает конвертер, если он помечен Uppercase
.
public class CarPolicyIdAttributeConverter implements GenericConverter {
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
final ConvertiblePair[] pairs = new ConvertiblePair[] {
new ConvertiblePair(String.class, String.class)
};
return ImmutableSet.copyOf(pairs);
}
@Override
public Object convert(final Object source, final TypeDescriptor sourceType, final TypeDescriptor targetType) {
if (targetType.getAnnotation(Uppercase.class) != null) {
return ((String)source).toUppercase();
}
return source;
}
}