我有一个Yaml文档,其中包含与列表对应的映射条目。这是一个例子:
environments:
qa: [ 'us-east-1' ]
staging: [ 'us-east-1', 'us-west-2' ]
我正在使用Jackson 2.3.2使用以下字段将文档解析为一个类;访问器:
private Map<String, List<String>> environments = new HashMap<String, List<String>>();
@JsonProperty
public Map<String, List<String>> getEnvironments() {
return environments;
}
@JsonProperty
public void setEnvironments(Map<String, List<String>> environments) {
this.environments = environments;
}
我正在使用以下内容测试Yaml文件的读取:
inputStream = new FileInputStream("src/test/resources/configuration_test.yml");
config = mapper.readValue(inputStream, MyConfiguration.class);
使用堆栈跟踪引发以下异常并不是特别有用:
Caused by: java.lang.IllegalArgumentException: Can not find a deserializer for non-concrete Collection type [collection type; class com.google.common.collect.ImmutableList, contains [simple type, class io.dropwizard.metrics.ReporterFactory]]
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.createCollectionDeserializer(BasicDeserializerFactory.java:814)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:392)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:350)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:263)
... 42 more
知道如何让杰克逊将Map值解析为List吗?
答案 0 :(得分:4)
我在扩展dropwizard的配置类时遇到了同样的问题。正如CAB所提到的,使用Jackson.newObjectMapper
代替new ObjectMapper
解决了这个问题。现在我的测试看起来像这样:
ObjectMapper mapper = Jackson.newObjectMapper(new YAMLFactory());
MyConfiguration myConfig = mapper.readValue(fixture("fixtures/configuration.yml"), MyConfiguration.class);
// Asserts
PS:我正在使用io.dropwizard.testing.FixtureHelpers.fixture
来获取YAML文件。
答案 1 :(得分:2)
这实际上是由于我从DropWizard'Configuration'类扩展的绑定类。解析在问题中提到的Yaml在使用未从DropWizard'Configuration'类扩展的绑定类时工作正常。
值得注意的是,只有在JUnit测试(当然是TDD)中运行时才会发生异常,而不是在运行DropWizard应用程序时。在正常应用程序启动期间读取Yaml文件时未发生异常。