2014-06-20 31 views
3

我有一个Yaml文档,其中包含对应于列表的映射条目。这里有一个例子:杰克逊异常时解析Yaml与列表值的地图

environments: 
    qa: [ 'us-east-1' ] 
    staging: [ 'us-east-1', 'us-west-2' ] 

我使用杰克逊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 

任何想法如何让杰克逊解析地图值作为一个列表?

回答

2

这实际上是由于我从DropWizard'Configuration'类扩展的绑定类。在使用没有从DropWizard'Configuration'类扩展的绑定类时,解析问题中提到的Yaml可以很好地工作。

值得注意的是,只有在运行JUnit测试(当然是TDD)时才会发生异常,而不是在运行DropWizard应用程序时发生异常。在正常应用程序启动期间读取Yaml文件时,不会发生异常。

4

您需要正确配置您的ObjectMapper。在dropwizard中,有Jackson.newObjectMapper()

3

我在扩展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文件。

+0

我不能做同样的事情newObjectMapper()不接受任何参数。 – Naresh

+0

您使用的是哪个dropwizard版本? – Carlos

+0

Dropwizard版本是0.7.1 – Naresh