Джерси разбора Java 8 время

Это мой пользовательский класс, и я должен сохранить дату, совместимую с ISO, в моей базе данных.

public class User {
 @Id
 private String id;
 private String email;
 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
 private LocalDateTime loginDate;
 }

Вот мой контроллер Джерси:

@POST
@Consumes("application/json")
@Produces("application/json")
public Response create( User user) {
 Map<object, object=""> apiResponse = new HashMap<object, object="">();
 Map<object, object=""> response = new HashMap<object, object="">();
 user = (User) userService.create(user);
}
</object,></object,></object,></object,>

Как я могу использовать формат datetime, подобный этому в майке? Можно ли отправить дату-время String и автоматически создать объект времени Java 8?

{ 
 "email" : "imz.[removed_email]"
 "loginDate" : "2015-04-17T06:06:51.465Z"
}
#

Обновление:

Я использовал Spring boot jersey и имел другие пакеты jsr

<dependency>
 <groupid>org.springframework.boot</groupid>
 <artifactid>spring-boot-starter-jersey</artifactid>
 </dependency>

Итак, я удалил все пакеты, кроме пакета spring -boot-jersey. используйте эту аннотацию для LocalDateTime

@JsonDeserialize(using = LocalDateTimeDeserializer.class)

Таким образом, я могу использовать ISODate и сохранять ISODate() в mongodb и создавать полностью сформированный mongodb LocalDateTime для интерфейса.

Проблема решена.

1 ответ

Пара вариантов, которые я вижу...

Вариант 1:

Предполагая, что вы поддерживаете аннотацию JAXB с помощью Jackson в качестве поставщика JSON...

Вы можете использовать XmlAdapter. Например

public class LocalDateTimeAdapter extends XmlAdapter<string, localdatetime=""> {
 @Override
 public LocalDateTime unmarshal(String dateString) throws Exception {
 Instant instant = Instant.parse(dateString);
 LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
 return dateTime;
 }
 @Override
 public String marshal(LocalDateTime dateTime) throws Exception {
 Instant instant = dateTime.toInstant(ZoneOffset.UTC);
 return DateTimeFormatter.ISO_INSTANT.format(instant);
 }
}
</string,>

Подробнее см. Мгновенный API.

Затем вы можете просто комментировать поле/свойство с помощью адаптера

@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
private LocalDateTime loginDate;

Вы также можете объявить аннотацию на уровне пакета, чтобы все использование в пакете использовало адаптер, без необходимости комментировать. Вы делаете это в файле с именем package-info.java, помещенным внутри пакета

@XmlJavaTypeAdapters({
 @XmlJavaTypeAdapter(type = LocalDateTime.class, 
 value = LocalDateTimeAdapter.class)
})
package thepackage.of.the.models;
import java.time.LocalDateTime;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters;

Вариант 2:

Используйте API-интерфейс Jackson напрямую. Значение, используйте JsonDeserializer и JsonSerializer. Например

public class LocalDateTimeDeserializer extends JsonDeserializer<localdatetime> {
 @Override
 public LocalDateTime deserialize(JsonParser jp, 
 DeserializationContext dc) throws IOException, JsonProcessingException {
 ObjectCodec codec = jp.getCodec();
 TextNode node = (TextNode)codec.readTree(jp);
 String dateString = node.textValue();
 Instant instant = Instant.parse(dateString);
 LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
 return dateTime;
 } 
}
public class LocalDateTimeSerializer extends JsonSerializer<localdatetime> {
 @Override
 public void serialize(LocalDateTime dateTime, JsonGenerator jg, 
 SerializerProvider sp) throws IOException, JsonProcessingException {
 Instant instant = dateTime.toInstant(ZoneOffset.UTC);
 jg.writeString(DateTimeFormatter.ISO_INSTANT.format(instant));
 } 
}
</localdatetime></localdatetime>

Вы можете применить это на уровне поля/свойства

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
public LocalDateTime loginDate;

Или на уровне ObjectMapper (так что вам не нужно комментировать все)

@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperContextResolver implements ContextResolver<objectmapper> {
 final ObjectMapper mapper = new ObjectMapper();
 public ObjectMapperContextResolver() {
 SimpleModule module = new SimpleModule();
 module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
 module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
 mapper.registerModule(module);
 // add JAXB annotation support if required
 mapper.registerModule(new JaxbAnnotationModule());
 }
 @Override
 public ObjectMapper getContext(Class<!--?--> type) {
 return mapper;
 } 
}
</objectmapper>

В основном, что происходит, это то, что MessageBodyWriter/MessageBodyReader, используемый для ummarshalling/marshalling, вызовет метод getContext, чтобы получить ObjectMapper

Примечание:

  • Вышеупомянутые решения будут анализироваться из формата 2007-12-03T10:15:30.00Z, как описано в Instant.parse, и будет сериализоваться на в том же формате, как описано в DateTimeFormatter.ISO_INSTANT

  • Вышеупомянутое также предполагает, что вы используете Jackson в качестве Serializer. Я использовал приведенную ниже зависимость (с Джерси 2.16), чтобы проверить

    <dependency>
     <groupid>org.glassfish.jersey.media</groupid>
     <artifactid>jersey-media-json-jackson</artifactid>
     <version>2.16</version>
    </dependency>

    Зависимость использует JacksonJaxbJsonProvider для поддержки аннотаций JAXB. Если вы используете более низкую версию Джерси, например 1.x, зависимость jersey-json должна предлагать поддержку аннотаций JAXB, если вы включите функцию сопоставления POJO. В качестве альтернативы для Jersey 1.x, если вы хотите использовать Jackson 2, вы можете использовать эту зависимость

    <dependency>
     <groupid>com.fasterxml.jackson.jaxrs</groupid>
     <artifactid>jackson-jaxrs-json-provider</artifactid>
     <version>2.4.0</version>
    </dependency>

    который на самом деле используется jersey-media-json-jackson. Таким образом, вы можете явно зарегистрировать JacksonJaxbJsonProvider или добавить пакет Jackson (com.fasterxml.jackson.jaxrs.json) для отображения пакетов для сканирования

UPDATE

См. также:

  • Формат Java 8 LocalDate Jackson. Существует модуль Jackson, который уже поставляется с сериализаторами для API-интерфейсов даты и времени Java 8.

licensed under cc by-sa 3.0 with attribution.