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-иш.

Примечания стороны:

  • В настоящее время мы обновляем образец фильма
  • Эта проблема совершенно не связана с ошибкой загрузки класса
Другие вопросы по тегам