Spring data neo4j rest projection возвращает null при использовании выражения SpEL для вложенного объекта

Рассмотрим следующий вывод:

Случай 1: при извлечении вложенного объекта из neo4j с использованием интерфейса neo4j данных Spring (проекция)

      {
    "name": "Dhoni",
    "currentLocation": {
        "city": {
            "name": "qwerqwer",
            "regionalState": {
                "state": {
                    "name": "zxvcxzcvc"
                }
            }
        }
    }
}

Проекционный интерфейс:

      public interface PersonProjection {//Root
    String getName();
    CurrentLocationProjection getCurrentLocation();
    
    public interface CurrentLocationProjection { // has relationship Props

        CityProjection getCity(); // target object in entity mapping

        interface CityProjection {

            String getName();
            
            RegionalStateProjection getRegionalState();

            interface RegionalStateProjection { // has relationship Props

                StateProjection getState(); // target object in entity mapping

                interface StateProjection {

                    String getName();
                    
                }
            }
        }
    }
}

Случай 2: Когда я попытался сопоставить вложенные значения с 1-м уровнем с помощью SpEL, все работает нормально, как вы можете видеть ниже.

       public interface PersonProjection {//Root
    String getName();
    CurrentLocationProjection getCurrentLocation();
    
    public interface CurrentLocationProjection {

        @Value("#{target.city.name}")
        String getCityName();

        @Value("#{target.city.regionalState.state.name}")
        String getStateName();

    }
}

выводит как:

      {
    "name": "Deva",
    "currentLocation": {
        "cityName": "qwerqwer",
        "stateName": "zxvcxzcvc"
    }
}

Случай 3: Проблема: Однако, когда я пытаюсь сопоставить вложенные значения с самим (корневым уровнем / корневым узлом) с помощью SpEL через @Value, как показано ниже:

      public interface PersonProjection {
    String getName();

    @Value("#{target.currentLocation.city.name}")
    String getCityName();

    @Value("#{target.currentLocation.city.regionalState.name}")
    String getStateName();
}

ожидаемый результат:

      {
    "name": "Dhoni",
    "cityName": "qwerqwer",
    "stateName": "zxvcxzcvc"
}

Но он выдает следующую ошибку, в которой указано, что currentLocation имеет значение null, как показано ниже: (но у него есть значение)

ПРЕДУПРЕЖДЕНИЕ 13600 --- [nio-8080-exec-6] .wsmsDefaultHandlerExceptionResolver: разрешено [org.springframework.http.converter.HttpMessageNotWritableException: не удалось записать JSON: EL1007E: свойство или поле 'city' не могут быть найдены по нулю; вложенное исключение - com.fasterxml.jackson.databind.JsonMappingException: EL1007E: свойство или поле 'city' не может быть найдено в null (через цепочку ссылок: com.sun.proxy.$Proxy162["currentLocation"])]

Я немного запутался, как это работает на 1-м уровне, а не на корневом уровне? может кто-нибудь указать мою ошибку / направить меня для достижения ожидаемого результата. Спасибо.

Примечание: SDN (Spring Data Neo4j) версии 6.1.2 для исх.

1 ответ

В Spring Data Neo4j была ошибка, связанная с языком Spring Expression, использующим связанные объекты, которые не являются частью проекции. https://github.com/spring-projects/spring-data-neo4j/issues/2325

тл;др; это решено в Spring Data Neo4j 6.1.3

Другие вопросы по тегам