Свойство с ключом [http-client.timers ['http-get']. Name] не найдено в свойствах из application.yml - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть приложение Spring Boot, которое использует Apache Camel для определения и управления маршрутизацией данных. Маршруты определяются с помощью XML DSL и имеют заполнители свойств для обеспечения изменчивости определенных маршрутов.

При попытке определить и использовать коллекцию элементов появляется ошибка:

Caused by: java.lang.IllegalArgumentException: Property with key [http-client.timers['http-get'].name] not found in properties from text: timer:{{http-client.timers['http-get'].name}}?delay={{http-client.timers['http-get'].start-delay}}&fixedRate=true&period={{http-client.timers['http-get'].period}}&repeatCount={{http-client.timers['http-get'].repeat-count}}

application.yml:

---

camel:
  springboot:
    name: MissionServices
    main-run-controller: true

http-client:
  server:
    host: localhost
    port: 9100
  endpoint: chars?size=500
  timers:
    - http-get:
      name: http-get
      start-delay: 0
      period: 1000
      repeat-count: 5
    - http-post:
      name: http-post
      start-delay: 0
      period: 5000
      repeat-count: 5

camel-context. xml:

...
  <camelContext id="camel-context"
    xmlns="http://camel.apache.org/schema/spring">

    <route id="http-get">
      <from
        uri="timer:{{http-client.timers['http-get'].name}}?delay={{http-client.timers['http-get'].start-delay}}&amp;fixedRate=true&amp;period={{http-client.timers['http-get'].period}}&amp;repeatCount={{http-client.timers['http-get'].repeat-count}}" />
      <log loggingLevel="INFO" message="start - http-get" />
      <setHeader name="HTTP_METHOD">
        <constant>GET</constant>
      </setHeader>
      <to
        uri="http:{{http-client.server.host}}:{{http-client.server.port}}/{{http-client.endpoint}}" />
      <log loggingLevel="INFO" message="end - http-get" />
    </route>

    <route id="http-post">
      <from uri="direct:start-http-post" />
      <log loggingLevel="INFO" message="start - http-post" />
      <setHeader name="HTTP_METHOD">
        <constant>POST</constant>
      </setHeader>
      <setHeader name="CONTENT_TYPE">
        <constant>application/json</constant>
      </setHeader>
      <to
        uri="http:{{http-client.server.host}}:{{http-client.server.port}}/{{http-client.endpoint}}" />
      <log loggingLevel="INFO" message="end - http-post" />
    </route>

  </camelContext>
...

У меня неправильно структурирован YAML, или я использую неверный синтаксис в определение маршрута для доступа к свойствам?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Прежде всего, отступ в yml неверен.

Во-вторых, структура не совсем правильная. То, что вы ищете, - это Карта объектов с именами полей, задержкой запуска, периодом и количеством повторений. Но вы объявили это списком.

Вы пытаетесь найти объект по ключу (http-get). Вы не можете искать список с ключом. Вы можете искать список с индексом. Вам нужна карта.

Правильная структура yaml должна быть

http-client:
  server:
    host: localhost
    port: 9100
  endpoint: chars?size=500
  timers:
     http-get:
        name: http-get
        start-delay: 0
        period: 1000
        repeat-count: 5
     http-post:
        name: http-post
        start-delay: 0
        period: 5000
        repeat-count: 5

Чтобы получить доступ к искомому значению, оно должно быть следующим:

{{http-client.timers.http-get.name}}
1 голос
/ 08 апреля 2020

Ну, http-client.timers['http-get'].name утверждает, что name вложено в http-get, а в вашем YAML:

  timers:
    - http-get:
      name: http-get
      start-delay: 0
      period: 1000
      repeat-count: 5

name: - это брат http-get: (они имеют одинаковый уровень отступа) , см. Этот ответ (подробности об обработке отступов в этом случае). Кроме того, вы начинаете последовательность здесь (с -), но путь не использует индексацию в последовательности. Вы, вероятно, хотите

  timers:
    http-get:
      name: http-get
      start-delay: 0
      period: 1000
      repeat-count: 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...