轻松访问Map中的嵌套属性

时间:2015-05-28 08:46:10

标签: java spring

我使用以下代码直接访问嵌套映射结构中的任何属性,如示例所示。

import com.google.common.collect.ImmutableMap;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.config.YamlProcessor;
import org.springframework.core.env.MapPropertySource;

import java.util.Map;

public class MapPropertySourceLearningTest {

    @Test
    public void testFlattenedMap() {
        Map map = ImmutableMap.of(
                "meta", ImmutableMap.of(
                        "pagination", ImmutableMap.of(
                                "position", "1",
                                "itemsPerPage", "50",
                                "totalPages", "9",
                                "totalItems", "438"
                        )
                )
        );

        MapPropertySource source = new MapPropertySource("map", new YamlProcessor() {
            public Map<String, Object> flatten(Map<String, Object> source) {
                return super.getFlattenedMap(source);
            }
        }.flatten(map));

        Assert.assertEquals("1", source.getProperty("meta.pagination.position"));
        Assert.assertEquals("9", source.getProperty("meta.pagination.totalPages"));
    }


}

我不喜欢扩展YamlProcessor类。 ¿有没有更好的方法来实现同样的目标?

1 个答案:

答案 0 :(得分:1)

PropertyUtils.getProperty中的BeanUtils.getProperty(返回一个对象)或Apache Commons BeanUtils(返回一个字符串)符合您的需要。但是它们会抛出一些笨拙的异常,所以你可能想要制作自己的包装器方法来处理你认为合适的异常。

Assert.assertEquals("1", PropertyUtils.getProperty(map, "meta.pagination.position"));
Assert.assertEquals("9", PropertyUtils.getProperty(map, "meta.pagination.totalPages"));
Assert.assertEquals("1", BeanUtils.getProperty(map, "meta.pagination.position"));
Assert.assertEquals("9", BeanUtils.getProperty(map, "meta.pagination.totalPages"));