Проблема в том, что JAX-RS требует, чтобы разделение параметров выполнялось одним из двух способов:
- Боб параметра имеет открытый конструктор, который принимает строку
- Параметр bean-компонента имеет статический метод
valueOf(String)
.
В вашем случае Date отделяется через конструктор Date(String)
, который не может обработать формат ввода, отправляемый вашим клиентом. У вас есть несколько вариантов, чтобы исправить это:
Вариант 1
Попросите вашего клиента изменить формат даты перед отправкой. Это идеал, но, вероятно, самый трудный для достижения!
Вариант 2
Обработка сумасшедшего формата даты. Варианты для этого:
Измените сигнатуру вашего метода, чтобы принять строку. Попытайтесь создать из этого объект Date, и если это не удастся, используйте свой собственный класс SimpleDateFormat для его анализа.
static final DateFormat CRAZY_FORMAT = new SimpleDateFormat("");
public String getData(@QueryParam("date") String dateString) {
final Date date;
try {
date = new Date(dateString); // yes, I know this is a deprecated method
} catch(Exception e) {
date = CRAZY_FORMAT.parse(dateString);
}
}
Определите свой собственный класс параметров, который выполняет логику, упомянутую выше. Дайте ему строковый конструктор или статический метод valueOf(String)
, который вызывает логику. И дополнительный метод для получения Даты, когда все сказано и сделано.
public class DateParameter implements Serializable {
public static DateParameter valueOf(String dateString) {
try {
date = new Date(dateString); // yes, I know this is a deprecated method
} catch(Exception e) {
date = CRAZY_FORMAT.parse(dateString);
}
}
private Date date;
// Constructor, Getters, Setters
}
public String getData(@QueryParam("date") DateParameter dateParam) {
final Date date = dateParam.getDate();
}
Или, наконец, вы можете зарегистрировать обработчик параметров для дат. Где его логика просто такая же, как упомянуто для других вариантов выше. Обратите внимание, что вам нужно использовать как минимум CXF 2.5.3, чтобы ваш обработчик параметров был оценен до того, как он попробует логику разделения по умолчанию.
public class DateHandler implements ParameterHandler<Date> {
public Map fromString(String s) {
final Date date;
try {
date = new Date(dateString); // yes, I know this is a deprecated method
} catch(Exception e) {
date = CRAZY_FORMAT.parse(dateString);
}
}
}