YAML config file throwing Spring error at startup

I am upgrading to the latest version of ORS-Docker and tyring to use the yml config file instead of a json.

This is my docker-compose -

version: '2.4'
services:
  ors:
    container_name: ors
    ports:
      - "8007:8080"
      - "9007:9001"
    image: ors-cors:latest
    # For versioned images see https://giscience.github.io/openrouteservice/installation/Running-with-Docker.html
    user: "${UID:-0}:${GID:-0}"
    # build:
    #   context: .
    #   args:
    #     OSM_FILE: ./ors-api/src/test/files/bayern-latest.osm.pbf
    volumes:
      - ./docker/graphs:/home/ors/ors-core/data/graphs
      - ./docker/elevation_cache:/home/ors/ors-core/data/elevation_cache
      - ./docker/logs/ors:/home/ors/logs
      - ./docker/logs/tomcat:/home/ors/tomcat/logs
      - ./docker/conf:/home/ors/ors-conf
      - ./docker/data:/home/ors/ors-core/data
    restart: on-failure
    environment:
      - BUILD_GRAPHS=False # Forces the container to rebuild the graphs, e.g. when PBF is changed
      - "JAVA_OPTS=-Djava.awt.headless=true -server -XX:TargetSurvivorRatio=75 -XX:SurvivorRatio=64 -XX:MaxTenuringThreshold=3 -XX:+UseG1GC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=4 -Xms1g -Xmx3g"
      - "CATALINA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001 -Dcom.sun.management.jmxremote.rmi.port=9001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost"
      - ORS_CONFIG=/home/ors/ors-conf/ors-config.json
    labels:
      - "traefik.http.middlewares.add-ors-prefix.addprefix.prefix=/ors"
      - "traefik.http.routers.ors.rule=PathPrefix(`/ors`)"
      - "traefik.http.routers.ors.tls.certresolver=letsencrypt"
      - "traefik.enable=true" 
      - "traefik.frontend.headers.allowedHosts=spatial.kfmplus.de,dah.kfmplus.de,kfmplus.gunzenhausen.de"
    networks:
      - services

networks:
  services:
    external: true

When I try to mount ors-config.yml instead of ors-config.json, I get this error while booting -

ttaching to ors
ors    | Running container as user root with id 0
ors    | ORS Path: /home/ors
ors    | Catalina Path: /home/ors/tomcat
ors    | ### openrouteservice configuration ###
ors    | 
ors    |   .   ____          _            __ _ _
ors    |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
ors    | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
ors    |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
ors    |   '  |____| .__|_| |_|_| |_\__, | / / / /
ors    |  =========|_|==============|___/=/_/_/_/
ors    |  :: Spring Boot ::                (v3.1.1)
ors    | 
ors    | 20 Nov 11:09:40 INFO                                                  main [ o.h.o.a.Application                      ]   Starting Application v8.0-SNAPSHOT using Java 17.0.7 with PID 1 (/home/ors/tomcat/webapps/ors/WEB-INF/classes started by root in /home/ors)
ors    | 20 Nov 11:09:40 INFO                                                  main [ o.h.o.a.Application                      ]   The following 1 profile is active: "default"
ors    | 20 Nov 11:09:42 WARN                                                  main [ ConfigServletWebServerApplicationContext ]   Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'openAPIConfig' defined in file [/home/ors/tomcat/webapps/ors/WEB-INF/classes/org/heigit/ors/api/OpenAPIConfig.class]: Failed to instantiate [org.heigit.ors.api.OpenAPIConfig$$SpringCGLIB$$0]: Constructor threw exception
ors    | 20 Nov 11:09:43 ERROR                                                 main [ o.s.b.SpringApplication                  ]   Application run failed
ors    | org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'openAPIConfig' defined in file [/home/ors/tomcat/webapps/ors/WEB-INF/classes/org/heigit/ors/api/OpenAPIConfig.class]: Failed to instantiate [org.heigit.ors.api.OpenAPIConfig$$SpringCGLIB$$0]: Constructor threw exception
ors    |        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:326) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:314) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1352) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1189) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:560) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:941) ~[spring-context-6.0.10.jar:6.0.10]
ors    |        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.0.10.jar:6.0.10]
ors    |        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) [spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) [spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:174) [spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:154) [spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.boot.web.servlet.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:96) [spring-boot-3.1.1.jar:3.1.1]
ors    |        at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171) [spring-web-6.0.10.jar:6.0.10]
ors    |        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4886) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:713) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:975) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1949) [catalina.jar:10.1.11]
ors    |        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
ors    |        at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
ors    |        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:10.1.11]
ors    |        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123) [?:?]
ors    |        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:776) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:426) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1656) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:846) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) [catalina.jar:10.1.11]
ors    |        at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
ors    |        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-util.jar:10.1.11]
ors    |        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) [?:?]
ors    |        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:241) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:918) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:10.1.11]
ors    |        at org.apache.catalina.startup.Catalina.start(Catalina.java:795) [catalina.jar:10.1.11]
ors    |        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
ors    |        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
ors    |        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
ors    |        at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
ors    |        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347) [bootstrap.jar:10.1.11]
ors    |        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) [bootstrap.jar:10.1.11]
ors    | Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.heigit.ors.api.OpenAPIConfig$$SpringCGLIB$$0]: Constructor threw exception
ors    |        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:224) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:110) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:323) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        ... 60 more
ors    | Caused by: java.lang.ExceptionInInitializerError
ors    |        at org.heigit.ors.api.OpenAPIConfig.<init>(OpenAPIConfig.java:49) ~[classes/:8.0-SNAPSHOT]
ors    |        at org.heigit.ors.api.OpenAPIConfig$$SpringCGLIB$$0.<init>(<generated>) ~[classes/:8.0-SNAPSHOT]
ors    |        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
ors    |        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?]
ors    |        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
ors    |        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?]
ors    |        at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?]
ors    |        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:110) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:323) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        ... 60 more
ors    | Caused by: com.typesafe.config.ConfigException$Parse: /home/ors/ors-conf/ors-config.yml: 2: Key '---' may not be followed by token: 'ors' (if you intended 'ors' to be part of a key or string value, try enclosing the key or value in double quotes)
ors    |        at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseError(ConfigDocumentParser.java:201) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseError(ConfigDocumentParser.java:197) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parseObject(ConfigDocumentParser.java:461) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.ConfigDocumentParser$ParseContext.parse(ConfigDocumentParser.java:648) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.ConfigDocumentParser.parse(ConfigDocumentParser.java:14) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.Parseable.rawParseValue(Parseable.java:262) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.Parseable.rawParseValue(Parseable.java:250) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:180) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:174) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.impl.Parseable.parse(Parseable.java:301) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.ConfigFactory.parseFile(ConfigFactory.java:792) ~[config-1.4.1.jar:1.4.1]
ors    |        at com.typesafe.config.ConfigFactory.parseFile(ConfigFactory.java:806) ~[config-1.4.1.jar:1.4.1]
ors    |        at org.heigit.ors.config.AppConfig.<init>(AppConfig.java:99) ~[ors-engine-8.0-SNAPSHOT.jar:8.0-SNAPSHOT]
ors    |        at org.heigit.ors.config.AppConfig.getGlobal(AppConfig.java:124) ~[ors-engine-8.0-SNAPSHOT.jar:8.0-SNAPSHOT]
ors    |        at org.heigit.ors.api.util.AppConfigMigration.<clinit>(AppConfigMigration.java:29) ~[classes/:8.0-SNAPSHOT]
ors    |        at org.heigit.ors.api.OpenAPIConfig.<init>(OpenAPIConfig.java:49) ~[classes/:8.0-SNAPSHOT]
ors    |        at org.heigit.ors.api.OpenAPIConfig$$SpringCGLIB$$0.<init>(<generated>) ~[classes/:8.0-SNAPSHOT]
ors    |        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
ors    |        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[?:?]
ors    |        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
ors    |        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[?:?]
ors    |        at java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[?:?]
ors    |        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:110) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:323) ~[spring-beans-6.0.10.jar:6.0.10]
ors    |        ... 60 more

This is my ors-config.yml -

---
ors:
  cors:
    allowed_origins: "*"
    allowed_headers: Content-Type, X-Requested-With, accept, Origin,
      Access-Control-Request-Method, Access-Control-Request-Headers,
      Authorization
    preflight_max_age: 600
  engine:
    source_file: ./ors-core/data/osm_file.pbf
    graphs_root_path: ./ors-core/data/graphs
    elevation:
      cache_path: ./ors-core/data/elevation_cache
    profiles:
      car:
        profile: driving-car
        elevation: true
        encoder_options:
          turn_costs: true
          block_fords: false
          use_acceleration: true
        preparation:
          min_network_size: 200
          min_one_way_network_size: 200
          methods:
            ch:
              enabled: true
              threads: 1
              weightings: fastest
            lm:
              enabled: false
              threads: 1
              weightings: fastest,shortest
              landmarks: 16
            core:
              enabled: true
              threads: 1
              weightings: fastest,shortest
              landmarks: 64
              lmsets: highways;allow_all
        execution:
          methods:
            ch:
              disabling_allowed: true
            lm:
              disabling_allowed: true
              active_landmarks: 6
            core:
              disabling_allowed: true
              active_landmarks: 6
        ext_storages:
          WayCategory: null
          HeavyVehicle: null
          WaySurfaceType: null
          RoadAccessRestrictions:
            use_for_warnings: true
      walking:
        profile: foot-walking
        encoder_options: null
        block_fords: false
        elevation: true
        ext_storages:
          WayCategory: null
          WaySurfaceType: null
          HillIndex: null
          TrailDifficulty: null

Is my YAML config file missing something or is wrong?

Also, no matter what, only 1 profile is active - “default”. This I guess is replaced when the config file takes effect?

Hi @akudekar

Try putting a # in front of the 3 dashes

Hi @amandus, that fixed the first issue but created another one.

 /home/ors/ors-conf/ors-config.yml: 2: Expecting end of input or a comma, got ':' (if you intended ':' to be part of a key or string value, try enclosing the key or value in double quotes)

This is my new config -

ors:
  cors:
    allowed_origins: "*"
    allowed_headers: Content-Type, X-Requested-With, accept, Origin,
      Access-Control-Request-Method, Access-Control-Request-Headers,
      Authorization
    preflight_max_age: 600
  engine:
    source_file: ./ors-core/data/osm_file.pbf
    graphs_root_path: ./ors-core/data/graphs
    elevation:
      cache_path: ./ors-core/data/elevation_cache
    profiles:
      car:
        profile: driving-car
        elevation: true
        encoder_options:
          turn_costs: true
          block_fords: false
          use_acceleration: true
        preparation:
          min_network_size: 200
          min_one_way_network_size: 200
          methods:
            ch:
              enabled: true
              threads: 1
              weightings: fastest
            lm:
              enabled: false
              threads: 1
              weightings: fastest,shortest
              landmarks: 16
            core:
              enabled: true
              threads: 1
              weightings: fastest,shortest
              landmarks: 64
              lmsets: highways;allow_all
        execution:
          methods:
            ch:
              disabling_allowed: true
            lm:
              disabling_allowed: true
              active_landmarks: 6
            core:
              disabling_allowed: true
              active_landmarks: 6
        ext_storages:
          WayCategory: null
          HeavyVehicle: null
          WaySurfaceType: null
          RoadAccessRestrictions:
            use_for_warnings: true
      walking:
        profile: foot-walking
        encoder_options: null
        block_fords: false
        elevation: true
        ext_storages:
          WayCategory: null
          WaySurfaceType: null
          HillIndex: null
          TrailDifficulty: null

I tried adding double quotes too.

It also shows as a valid YAML in yamllint.

Am I missing something?

i think in your docker-compose you also have the change the env var to: ORS_CONFIG_LOCATION.
I suspect that ORS_CONFIG still goes to the json parser and that’s why it gets a JSON linting error.

Hi @amandus ,

That worked beautifully, thanks.

2 Likes