API, с которым я работаю, решил принять UUID как строки с кодировкой Base32 вместо стандартного шестнадцатеричного, разделенного штрихами формата, который UUID.fromString()
ожидает. Это означает, что я не могу просто написать @QueryParam UUID myUuid
в качестве параметра метода, поскольку преобразование завершилось с ошибкой.
Я работаю над этим, создавая пользовательский объект с другим конвертером fromString
, который будет использоваться с аннотациями @QueryString
и @FormParam
. Я хотел бы иметь возможность получить доступ к контексту преобразования в методе fromString
, чтобы я мог обеспечить лучшие сообщения об ошибках. Прямо сейчас, все, что я могу сделать, это следующее:
public static Base32UUID fromString(String uuidString) {
final UUID uuid = UUIDUtils.fromBase32(uuidString, false);
if (null == uuid) {
throw new InvalidParametersException(ImmutableList.of("Invalid uuid: " + uuidString));
}
return new Base32UUID(uuid);
}
Я хотел бы узнать, какой параметр имеет недопустимый UUID, поэтому мои зарегистрированные исключения и возвращенные пользовательские ошибки кристально чисты. В идеале мой метод преобразования будет иметь дополнительный параметр для деталей, например:
public static Base32UUID fromString(
String uuidString,
String parameterName // New parameter?
) {
final UUID uuid = UUIDUtils.fromBase32(uuidString, false);
if (null == uuid) {
throw new InvalidParametersException(ImmutableList.of("Invalid uuid: " + uuidString
+ " for parameter " + parameterName));
}
return new Base32UUID(uuid);
}
Но это нарушит условное соглашение, что Джерси найдет метод синтаксического анализа:
- Имейте статический метод с именем
valueOf
илиfromString
, который принимает один аргумент String (см., например,Integer.valueOf(String)
иjava.util.UUID.fromString(String))
;
Я также посмотрел на ParamConverterProvider
, который также может быть зарегистрирован для обеспечения преобразования, но, похоже, он не добавляет достаточного контекста. Ближе всего он представляет собой массив аннотаций, но из того, что я могу сказать об аннотации, вы не можете отступать оттуда, чтобы определить, какая переменная или метод аннотация включена. Я нашел this и эти примеры, но они не 't эффективно использовать параметр Annotations[]
или выставлять любой контекст преобразования, который я могу видеть.
Есть ли способ получить эту информацию? Или мне нужно отступить к явному конверсионному вызову в моем методе конечных точек?
Если это имеет значение, я использую Dropwizard 0.8.0, который использует Jersey 2.16 и Jetty 9.2.9.v20150224.