Конфигурация Spring Cloud выбрасывает NPE для массива в файле - PullRequest
0 голосов
/ 24 апреля 2020

Мы использовали Spring Cloud Config версии 2.1, и это сработало. Мы обновили до Spring Cloud Config 2.2, и теперь он не работает. Более подробная информация: https://github.com/spring-cloud/spring-cloud-config/issues/1599 Я сообщил о проблеме, чтобы ускорить процесс, или, возможно, это не проблема. Я не знаю, поэтому я прошу вас помочь.

Наш файл конфигурации: python -service.yml

resources:
  - resource1
  - resource2

newResources: []

Как я узнал, Spring Облачный клиент конфигурации запрашивает выборку конфигурации и передает заголовок

Accept: application/vnd.spring-cloud.config-server.v2+json. В конфигурации Spring Cloud v 2.1

Обратите внимание, что версия Spring Cloud 2.1 не отправляет такой заголовок; вместо этого он отправляет Accept: application/json

HTTP http://localhost:8888/python-service/dev
Accept: application/vnd.spring-cloud.config-server.v2+json

Возвращает

{
    "name": "python-service",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": null,
    "state": null,
    "propertySources": [
        {
            "name": "file:/configuration/python-service.yml",
            "source": {
                "resources[0]": "resource1",
                "resources[1]": "resource2",
                "newResources": []
            }
        }
    ]
}

Однако, это Spring Cloud Config v 2.2, он терпит неудачу

{
    "timestamp": "2020-04-24T08:38:19.803+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Could not construct context for config=python-service profile=dev label=null includeOrigin=true; nested exception is java.lang.NullPointerException",
    "path": "/python-service/dev"
}

Забавно, что что в журналах config-service нет вывода журнала исключений!

Если я удалю заголовок accept, я получу ( версия 2.2 )

{
    "name": "python-service",
    "profiles": [
        "dev"
    ],
    "label": null,
    "version": null,
    "state": null,
    "propertySources": [
        {
            "name": "file:/configuration/python-service.yml",
            "source": {
                "resources[0]": "resource1",
                "resources[1]": "resource2",
                "newResources": ""
            }
        }
    ]
}

Здесь, почему "newResources": "" стал пустой строкой, если ожидается, что он будет пустым массивом - другой вопрос.

Подводя итог

  • 1) Как использовать пустой массив в Spring Cloud config.
  • 2) Почему в журналах конфигурационной службы Spring отсутствует сообщение о NPE.
  • 3) Если заголовок accept не указан, почему "newResources": "" стал пустой строкой, если я ожидал пустой массив.

На данный момент я могу удалить пустой массив из моей конфигурации, но это очень страшно, потому что наша конфигурация используется во многих сервисах! Это нарушает обратную совместимость.

1 Ответ

0 голосов
/ 28 апреля 2020

Оказывается, это ошибка в Spring Boot.

https://github.com/spring-cloud/spring-cloud-config/issues/1572#issuecomment -620496235

https://github.com/spring-projects/spring-boot/issues/20506

Возможные варианты:

  • 1) Дождитесь исправления и обновите библиотеки.

  • 2) Что мы сделали. Мы заменили пустой массив пустым элементом.

newResources:
anotherField: value

или используйте null. Тем не менее, убедитесь, что ваш код может справиться с этим. Кроме того, emptyArray можно рассматривать как emptyString. Я узнал об этом в отладчике.

...