Не удается создать объект Java из-за ошибки недопустимого тега

Я создал веб-приложение, которое взаимодействует с кластером кеша Redis через драйвер Redisson. Драйвер Redisson загружает свою конфигурацию из файла YAML. Конфигурация содержит несколько атрибутов, которые создаются с помощью конструктора для создания объекта. По какой-то причине конфигурация не загружается из-за этих вызовов методов конструктора со следующей ошибкой:

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/SessionManagement]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:153)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:939)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1812)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: Can't construct a java object for org.redisson.connection.balancer.RoundRobinLoadBalancer; exception=Invalid tag: org.redisson.connection.balancer.RoundRobinLoadBalancer
 in 'reader', line 14, column 17:
      loadBalancer: !<org.redisson.connection.balanc ... 
                    ^

    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:350)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
    at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:373)

Вот файл YAML:

---
clusterServersConfig:
  idleConnectionTimeout: 10000
  pingTimeout: 1000
  connectTimeout: 1000
  timeout: 1000
  retryAttempts: 3
  retryInterval: 1000
  reconnectionTimeout: 3000
  failedAttempts: 3
  password: null
  subscriptionsPerConnection: 5
  clientName: null
  loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
  slaveSubscriptionConnectionMinimumIdleSize: 1
  slaveSubscriptionConnectionPoolSize: 25
  slaveConnectionMinimumIdleSize: 5
  slaveConnectionPoolSize: 100
  masterConnectionMinimumIdleSize: 5
  masterConnectionPoolSize: 100
  readMode: "SLAVE"
  nodeAddresses:
  - "//172.31.150.113:7000"
  - "//172.31.150.113:7001"
  - "//172.31.150.113:7002"
  - "//172.31.150.113:7003"
  - "//172.31.150.113:7004"
  - "//172.31.150.113:7005"
  scanInterval: 1000
threads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
useLinuxNativeEpoll: false
eventLoopGroup: null

Я проверил, что необходимые библиотеки повторного создания для создания объектов находятся в пути к классам.
Кто-нибудь знает, почему Snakeyaml не может правильно загрузить этот YAML-файл?


person Nel    schedule 05.04.2016    source источник
comment
У меня ваша конфигурация отлично работает, возможно, вы сможете добавить свою версию redisson.   -  person sel-fish    schedule 13.04.2016


Ответы (1)


При использовании этой формы для загрузки как javabean без предопределенного тега я считаю, что синтаксис состоит из двух восклицательных знаков и без окружающих маркеров. т.е.

codec: !!org.redisson.codec.JsonJacksonCodec{}

Если загружается как класс с конструктором и предопределенным тегом, то скобки вместо фигурных скобок:

codec: !org.redisson.codec.JsonJacksonCodec[]

Если это не помогает, подумайте также о том, какую версию Snakeyaml вы используете.

person kaliatech    schedule 05.04.2016
comment
Спасибо за быстрый ответ! К сожалению, до сих пор не работает. Я использую Snakeyaml 1.16. - person Nel; 05.04.2016