Пользовательский формат даты с Jax-RS в Apache CXF? - PullRequest
4 голосов
/ 15 мая 2010

Я пытался найти, как настроить формат даты при использовании jax-rs в apache CXF. Я посмотрел на коды, и кажется, что он поддерживает только примитивы, enum и специальный хак, который предполагает, что тип, связанный с @FormParam, имеет конструктор с одним строковым параметром. Это заставляет меня использовать String вместо Date, если я хочу использовать FormParam. это отчасти уродливо. Есть ли лучший способ сделать это?

@POST
@Path("/xxx")
public String addPackage(@FormParam("startDate") Date startDate)
    {
      ...
    } 

Спасибо

Ответы [ 4 ]

4 голосов
/ 18 января 2011

начиная с CXF 2.3.2 регистрация ParameterHandler сделает это. Также всегда можно переопределить значение даты (переданное как часть запроса и т. Д.), Используя фильтры RequestHandler для даты (String) по умолчанию для работы

4 голосов
/ 11 мая 2011

Одно простое приложение - это взять параметр как String и проанализировать его в теле метода для преобразования его в java.util.Date

Другой - создать один класс, имеющий конструктор, принимающий параметр типа String. Выполните то же самое, что я сказал в первом подходе.

вот код для второго подхода.

@Path("date-test")
public class DateTest{

    @GET
    @Path("/print-date")
    public void printDate(@FormParam("date") DateAdapter adapter){
        System.out.println(adapter.getDate());
    }

    public static class DateAdapter{
        private Date date;
        public DateAdapter(String date){
            try {
                this.date = new SimpleDateFormat("dd/MM/yyyy").parse(date);
            } catch (Exception e) {

            }
        }

        public Date getDate(){
            return this.date;
        }
    }
}

Надеюсь, это поможет.

0 голосов
/ 22 июля 2015

В Apache-cxf 3.0 вы можете использовать ParamConverterProvider для преобразования параметра в Date.

Следующий код скопирован с моего ответа на этот вопрос .

public class DateParameterConverterProvider implements ParamConverterProvider {

    @Override
    public <T> ParamConverter<T> getConverter(Class<T> type, Type type1, Annotation[] antns) {
        if (Date.class.equals(type)) {
            return (ParamConverter<T>) new DateParameterConverter();
        }
        return null;
    }

}

public class DateParameterConverter implements ParamConverter<Date> {

    public static final String format = "yyyy-MM-dd"; // set the format to whatever you need

    @Override
    public Date fromString(String string) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        try {
            return simpleDateFormat.parse(string);
        } catch (ParseException ex) {
            throw new WebApplicationException(ex);
        }
    }

    @Override
    public String toString(Date t) {
        return new SimpleDateFormat(format).format(t);
    }

}
0 голосов
/ 09 сентября 2010

После прочтения кодов CXF (2.2.5) это невозможно, и жестко запрограммировано использование конструктора Date (String), так что бы ни поддерживал Date (String).

...