Spring Data Neo4j 5 - HttpMessageNotWritableException при попадании в конечные точки ресурса
В попытке воссоздать официальный пример Movies Spring Data Neo4j в Scala я столкнулся с проблемой jsonifying на слое Spring Data Neo4j.
Подробности указаны в README
в этом примере проекта.
Загрузка приложения Spring и нажатие /movies/<id>
дает следующую трассировку стека:
018-03-27 15:33:23 WARN DefaultHandlerExceptionResolver: 442 - Не удалось записать HTTP-сообщение: org.springframework.http.converter.HttpMessageNotWritableException: не удалось записать JSON: недопустимое определение идентификатора объекта для movies.Movie: не удается найти свойство с именем 'Я бы'; вложенное исключение: com.fasterxml.jackson.databind.JsonMappingException: недопустимое определение идентификатора объекта для фильмов. Фильм: невозможно найти свойство с именем 'id' (через цепочку ссылок: org.springframework.hateoas.PagedResources["_embedded"]->java.util.Collections$UnmodifiableMap["кино"]->java.util.ArrayList[0])
Я открыл официальный выпуск Spring Data Neo4j JIRA здесь.
Изменить: После последнего комментария я удалил несвязанные теории о коренной причине из этого поста. И я обновил пример проекта, чтобы выставить идентификаторы на Spring Data Rest
слой с помощью PostConstruct
метод (спасибо @meistermeier). Я также попробовал RepositoryRestConfigurerAdapter
метод. Тем не менее, оригинал HttpMessageNotWritableException
сохраняется. Есть идеи?
Обновление: Моделирование Movie.scala
после примера SDN-University я попытался использовать com.voodoodyne.jackson.jsog.JSOGGenerator
в качестве генератора идентификаторов объектов. Я могу успешно ударить /movies/
но единственным ключом является "id", и это просто индекс, а не фактический идентификатор. Тем не менее, 38 фильмов возвращают, количество в наборе данных фильмов. Я бы подумал, что это сужает проблему до jsonfying.
Обновление 2: с помощью Bandaid вручную сформировать json
в контроллере (используя object-to-map
функция и map-to-json
функция) Я наконец-то смог отправить данные через конечные точки. Я обновил пример проекта, чтобы продемонстрировать это. Я могу успешно извлекать объекты из movieRepository
и манипулировать ими, как мне угодно. Я думаю, что это явно сузило проблему до jsonification. У кого-нибудь есть четкий пример (Java или Scala) о том, как правильно аннотировать NodeEntity
с JsonIdentifyInfo
?
2 ответа
Наконец, спустя больше месяца я решил проблему.
Вы должны добавить scala.beans.BeanProperty
любому vars
для этого нужны генерируемые геттеры и сеттеры.
Добавил это в мой NodeEntity
свойства, а также на sessionFactory
боб и transactionManager
боб, и все мои проблемы волшебным образом исчезли.
Было бы целесообразно задокументировать эту обязательную аннотацию для использования этих библиотек в Scala.
Сначала обратите внимание на идентификатор как String
часть: внутренний идентификатор Neo4j должен быть типа Long
(абзац между информационными разделами здесь: https://neo4j.com/docs/ogm-manual/current/reference/). С другим типом, чем Long
Neo4j OGM не может найти так называемое поле нативного идентификатора в вашем классе.
Теперь вернемся к первоначальной проблеме, с которой вы столкнулись.
Spring Data Rest подавляет экспонирование идентичных полей, а Spring Data Neo4j помечает / регистрирует поля с @Id
аннотация как таковая. Чтобы использовать эти поля id, вы можете, например, сделать что-то вроде этого:
public class SpringBootApplication {
private final RepositoryRestConfiguration configuration;
public SpringBootApplication(RepositoryRestConfiguration configuration) {
this.configuration=configuration;
}
@PostConstruct
public void configuration() {
configuration.exposeIdsFor(Person.class);
}
Я знаю, что это Java, так что это больше, но Scala-иш.
Примечания стороны:
- В настоящее время мы обновляем образец фильма
- Эта проблема совершенно не связана с ошибкой загрузки класса