Dictionary Groovy:map.get()不';检索不到

Dictionary Groovy:map.get()不';检索不到,dictionary,groovy,tostring,Dictionary,Groovy,Tostring,要求:读取spring配置。并尝试将Springbean解组为Java对象 我对以下Groovy代码有一些问题: println(“找到>>”+beanMap[beanObject.parent])这不会返回 正如我所期望的那样,让我学习bean类。更奇怪的是,接下来的两行输出 我希望toString()的输出看起来像,如果clazz为null,它应该打印parentClazz,但显然不是这样。为什么会这样 源代码 class TestGroovy { public static voi

要求:读取spring配置。并尝试将Springbean解组为Java对象

我对以下Groovy代码有一些问题:

  • println(“找到>>”+beanMap[beanObject.parent])这不会返回 正如我所期望的那样,让我学习bean类。更奇怪的是,接下来的两行输出
  • 我希望toString()的输出看起来像,如果clazz为null,它应该打印parentClazz,但显然不是这样。为什么会这样
  • 源代码

    class TestGroovy {
        public static void main(String[] args) throws FileNotFoundException {
            readXML();
        }
    
        private static void readXML() {
            //def beans = new XmlSlurper().parse(new File("C:/Developer/interest-ratecollector-system.xml"))
            def beans = new XmlSlurper().parse(new File("C:/Developer/beans.xml"))
            def beanMap = [:];
            //println beans.bean.size()
            for (bean in beans.bean.list()) {
                //print("id=" + bean.@id + ",clazz=" + bean.@class + ",parent = " + bean.@parent)
                Bean beanObject = new Bean(id: bean.@id, clazz: bean.@class, parent: bean.@parent)
    
    
                beanMap[beanObject.id] = beanObject;
    
                //println("map>"+beanMap)
    
                if (beanMap.size()>1)
                    beanMap.each{element ->
                            println "elem="+(element.key==beanObject.parent)
                            println(beanMap[element.key])
                            println(beanMap[beanObject.parent])
                    }
    
                beanObject.parentClazz = beanMap[beanObject.parent]
                println("found >> "+beanMap[beanObject.parent])
                println("\nbeanObject="+beanObject)
                println()
            }
        }
    }
    
    @ToString(includeNames=true)
    class Bean {
        def id, clazz, parent,parentClazz
    
    
    
        @Override
        public String toString() {
            return "Bean{" +
                    "id=" + id +
                    ",clazz=" + clazz?:parentClazz +
                    ", parent=" + parent +
                     "parentClazz=" + parentClazz +
                    '}';
        }
    
        boolean equals(o) {
            if (this.is(o)) return true
            if (getClass() != o.class) return false
            Bean bean = (Bean) o
            if (id != bean.id) return false
            return true
        }
    
        int hashCode() {
            return id.hashCode()
        }
    
    
    }
    
    XML

      <beans>
        <bean id="class1" class="com.Class"  abstract="true" init-method="init">
        </bean>
    
        <bean id="SHRED" parent="class1" abstract="true">
            <property name="serviceName">
                <value>SSS</value>
            </property>
        </bean>
    
    
        </beans>
    

    您正在将属性作为贴图的键放入。尝试更改:

    Bean beanObject = new Bean( id: bean.@id, clazz: bean.@class, parent: bean.@parent )
    

    此外,您还可以通过将
    Bean
    更改为:

    @EqualsAndHashCode( includes=[ 'id' ] )
    class Bean {
        def id, clazz, parent,parentClazz
    
        String toString() {
            "Bean{id=$id clazz=${clazz ?: parentClazz?.clazz} parent=$parent}"
        }
    }
    
    您的
    readXML
    方法可以提炼为:

    private static void readXML() {
        def beans = new XmlSlurper().parse( new File("C:/Developer/beans.xml") )
        def beanMap = beans.bean.inject( [:] ) { map, bean ->
            Bean beanObject = new Bean( id     : bean.@id.text(),
                                        clazz  : bean.@class.text(),
                                        parent : bean.@parent.text() )
            map << [ (beanObject.id): beanObject ]
            beanObject.parentClazz = map[ beanObject.parent ]
            map
        }
    }
    
    private static void readXML(){
    def beans=new XmlSlurper().parse(新文件(“C:/Developer/beans.xml”))
    def beanMap=beans.bean.inject([:]){map,bean->
    Bean beanObject=新Bean(id:Bean@id.text(),
    clazz:bean.@class.text(),
    父:bean。@parent.text()
    地图
    
    map太完美了。谢谢Tim,这是我的第一个Groovy代码,显然不是很紧凑。@anirbanchowdhury不用担心:-)主要的是它工作正常,而且你很喜欢它的语言:-)
    @EqualsAndHashCode( includes=[ 'id' ] )
    class Bean {
        def id, clazz, parent,parentClazz
    
        String toString() {
            "Bean{id=$id clazz=${clazz ?: parentClazz?.clazz} parent=$parent}"
        }
    }
    
    private static void readXML() {
        def beans = new XmlSlurper().parse( new File("C:/Developer/beans.xml") )
        def beanMap = beans.bean.inject( [:] ) { map, bean ->
            Bean beanObject = new Bean( id     : bean.@id.text(),
                                        clazz  : bean.@class.text(),
                                        parent : bean.@parent.text() )
            map << [ (beanObject.id): beanObject ]
            beanObject.parentClazz = map[ beanObject.parent ]
            map
        }
    }
    
    private static void readXML() {
        def beans = new XmlSlurper().parse( new File("C:/Developer/beans.xml") )
        def beanMap = beans.bean.inject( [:] ) { map, bean ->
            map << [ (bean.@id.text()): new Bean( id          : bean.@id.text(),
                                                  clazz       : bean.@class.text(),
                                                  parent      : bean.@parent.text(),
                                                  parentClazz : map[ bean.@parent.text() ] ) ]
        }
    }