Я думаю, что это старый вопрос, но LocalDate
вы должны зарегистрировать реализацию ParamConverterProvider
, которая возвращает ParamConverter
экземпляр, который способен создать LocalDate
из String
.
Если вы проверите javadoc на ParamConverter
, вы увидите, что существует два метода: E fromString(String value)
и String toString(E value)
. Кроме того, если вы видите документацию для ParamConverterProvider
, вы заметите, что она имеет следующий метод: <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation annotations[])
.
В принципе, вы должны создать реализацию ParamConverter<LocalDate>
, что может создать LocalDate
из String
, а затем вернуть экземпляр этого осуществления от зарегистрированного ParamConverterProvider
.
Вот пример:
package com.example;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Optional;
/**
* The {@link ParamConverterProvider} for {@link java.time} package classes
* (i.e {@link LocalDate}, {@link LocalTime} and {@link LocalDateTime}).
*/
@Provider
public class Java8TimeParamConverterProvider implements ParamConverterProvider {
/**
* Contains a {@link DateTimeFormatter} whose pattern is "yyyy-MM-dd".
*/
public static final DateTimeFormatter CLASSIC_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
if (rawType == LocalDate.class) {
//noinspection unchecked
return (ParamConverter<T>) new Java8LocalDateClassicFormatParamConverter();
}
if (rawType == LocalTime.class) {
return null; // TODO: implement
}
if (rawType == LocalDateTime.class) {
return null; // TODO: implement
}
return null;
}
/**
* The {@link ParamConverter} for {@link LocalDate} using the {@link Formatters#CLASSIC_DATE_FORMATTER}.
*/
private static class Java8LocalDateClassicFormatParamConverter implements ParamConverter<LocalDate> {
@Override
public LocalDate fromString(String value) {
return Optional.ofNullable(value)
.map(Formatters.CLASSIC_DATE_FORMATTER::parse)
.map(LocalDate::from)
.orElse(null);
}
@Override
public String toString(LocalDate value) {
return Formatters.CLASSIC_DATE_FORMATTER.format(value);
}
}
}
Вы должны зарегистрировать поставщика. В вашей ResourceConfig
вы должны включать следующее:
public class AppConfig extends ResourceConfig {
public AppConfig() {
register(Java8TimeParamConverterProvider.class);
}
}
Или, если вы делаете сканирование пакетов:
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("com.example");
}
}
(Вот почему @Provider
аннотацию входит в определение Java8TimeParamConverterProvider
класса). Обратите внимание, что это не сработает, если вы используете весеннюю загрузку, так как в данный момент есть проблемы с последней банкой, созданной плагином для загрузки весны.
Другой способ зарегистрировать поставщика услуг - web.xml
.В этом случае необходимо включить следующее:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Include the following init-param if you want to do package scanning -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.example
</param-value>
</init-param>
<!-- Or use the following init-param if you want to do class register -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.example.Java8TimeParamConverterProvider</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Надеюсь, это вам поможет!
Ну, цифры 1 и 5 не относятся к DateTime, поэтому проверьте остальные. Я не думаю, что есть метод valueOf или конструктор со строкой, так что оставляет номер 4 –
@ cricket_007 не знаю, что это значит, но спасибо за предложение! – Drew13
Ваши «предложения», которые вы указали. Прочитайте их? Знаете ли вы, что означает «примитивный» или «valueOf»? По сути, проблема в том, что 'DateTime' может буквально быть любым форматом *, и JAX-RS не может справиться с этим для вас. Для вас было бы более разумно отправить обычную строку в вашу конечную точку, которая должна соответствовать вашему ожидаемому формату даты ('hh: mm: ss') –