LocalDateTime преобразуется не в строку, а в объект Json
Я хочу сериализовать дату создания типа java.time.LocalDateTime как String при вызове службы spring-data-rest. Поле сущности аннотируется с помощью DateTimeFormat(iso=ISO.DATE_TIME). Я также зарегистрировал конвертер LocalData в строку в классе конфигурации Spring.
@Override
@Bean
protected ConversionService neo4jConversionService() throws Exception {
ConversionService conversionService = super.neo4jConversionService();
ConverterRegistry registry = (ConverterRegistry) conversionService;
registry.removeConvertible(LocalDateTime.class, String.class);
registry.removeConvertible(String.class, LocalDateTime.class);
registry.addConverter(new DateToStringConverter());
registry.addConverter(new StringToDateConverter());
return conversionService;
}
private class DateToStringConverter implements Converter<LocalDateTime, String> {
@Override
public String convert(LocalDateTime source) {
return source.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}
}
Но конвертер не вызывается, и дата создания сериализуется в виде структуры Json, например:
creationDate: {
dayOfYear: 337,
monthValue: 12,
hour: 10,
minute: 15,
second: 30,
nano: 0,
year: 2011,
month: "DECEMBER",
dayOfMonth: 3,
dayOfWeek: "SATURDAY",
chronology: {
id: "ISO",
calendarType: "iso8601"
}
Это определение сущности:
@NodeEntity
public class CmmnElement {}
public class Definitions extends CmmnElement {
@DateTimeFormat(iso = ISO.DATE_TIME)
private LocalDateTime creationDate;
}
Простой репозиторий выглядит так:
@RepositoryRestResource(collectionResourceRel="definitions", path="/definitions")
public interface DefinitionsRepository extends PagingAndSortingRepository<Definitions, Long>{}
CreationDate создается LocalDateTime.parse() из этой строки "2011-12-03T10:15:30".
У меня есть пример на github: https://github.com/gfinger/neo4j-tests/tree/master/neo-spring-test Класс Leaf имеет creationDate типа LocalDateTime. Если вы запустите mvn spring-boot: запустите встроенную базу данных Neoi4J, которая инициализируется с экземпляром Leaf. При вызове http://localhost:8080/leaf%7B?page,size,sort%7D отображается дата в виде структуры json.
Как я могу получить эту строку вместо объекта Json?
1 ответ
Хорошо, извините за задержку. Я проверил это, и если вы посмотрите в базу данных Neo4j в target/cmmn.db
это показывает, что дата правильно сериализована как строка.
bin/neo4j-shell -path target/cmmn.db/
neo4j-sh (?)$ match (n) return *
> ;
+--------------------------------------------------------------------------------------+
| n |
+--------------------------------------------------------------------------------------+
| Node[0]{name:"Senat"} |
| Node[1]{name:"Cato",description:"Ceterum Censeo",creationDate:"2011-12-03T10:15:30"} |
+--------------------------------------------------------------------------------------+
2 rows
Я думаю, что проблема скорее в json-конвертерах spring-data-rest, которые могут быть не настроены для LocalDateTime
,
Вы должны добавить это как зависимость:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.5</version>
</dependency>
Тогда листья представлены как:
"name" : "Cato",
"description" : "Ceterum Censeo",
"creationDate" : "2011-12-03T10:15:30",
"_links" : {
"self" : {
"href" : "http://localhost:8080/leaf/7"
}
Смотрите: https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring
У меня была аналогичная проблема весной mvc. Добавление зависимости jackson-datatype-jsr310 не решило мою проблему, вместо этого Custom formatter выполнил свою работу.
Здесь я обнаружил, что /questions/37403464/stroka-json-iz-localdatetimejava-8-v-spring-mvc/37403484#37403484
public class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDateTime>{
private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
@Override
public void serialize(LocalDateTime dateTime, JsonGenerator generator, SerializerProvider sp)
throws IOException, JsonProcessingException {
String formattedDateTime = dateTime.format(DateTimeFormatter.ofPattern(dateTimeFormat));
generator.writeString( formattedDateTime);
}
}
и используйте этот настраиваемый сериализатор в поле LocalDateTime:
@JsonSerialize(using = CustomLocalDateTimeSerializer.class)
private LocalDateTime creationDate;