Velocity Engine split()返回String而不是Array

时间:2015-03-09 22:11:47

标签: maven velocity maven-archetype

我正在使用mvn archetype:generate来模拟我项目中的一些东西。我在使用Maven 3.2.2 Velocity Engine split()方法时遇到了麻烦。我还没弄清楚Velocity Maven正在使用什么版本。

#set($foo = "one:a, two:b, three:c")
$!foo
$foo.split(",")

#foreach($bar in $foo.split(","))
    $!bar
    $bar.split(":")

    #set($number = $bar.split(":").get(0))
    number = $!number

    #set($letter = $bar.split(":").get(1))
    letter = $!letter
#end

预期产出:

one:a, two:b, three:c
['one:a', 'two:b', 'three:c']

one:a
['one', 'a']
number = one
letter = a

two:b
...

实际输出:

one:a, two:b, three:c
[Ljava.lang.String;@6cff380

one:a
[Ljava.lang.String;@5a587f23
number =
letter = 

two:b
[Ljava.lang.String;@2c8b586a
...

正如你所看到的,#foreach块中使用的第一个split()工作正如我期望用逗号分割字符串并迭代三个子字符串,但是当我打印$ bar.split(“:”)时,我得到了奇怪的字符串指针和#set($ number = $ bar.split(“:”)。get(0))什么都不打印,因为.get()是在String而不是Array上调用的。考虑到这一点,我能够想出这个可怕的黑客:

#foreach ($bar in $foo.split(","))
    #set ($i = 0)
    #foreach($hack in $bar.split(":"))
        #if($i == 0)
            #set ($number = $hack)
        #else
            #set ($letter = $hack)
        #end
        #set($i = $i + 1)
    #end
number = $number
letter = $letter
#end

但必须有一个更好的方法,我不能在良心上使用这个代码。我一直在使用Velocity总共3个小时,所以我肯定会责怪这里,#foreach知道我不知道什么?

感谢您的帮助。

编辑:根据this maven archetype正在使用Velocity Engine 1.5

1 个答案:

答案 0 :(得分:1)

[Ljava.lang.String;@6cff380不是字符串引用,它是一个字符串数组引用,所以到目前为止,eveything是正常的(除非Velocity可以格式化数组而不是输出其toString()方法)

然后,当你在数组上调用get(i)时,你什么都得不到,而自从Velocity 1.6你应该得到你想要的东西,那就是 ith 元素。我猜你的Velocity版本太旧了......