Velocity Engine split() returns 字符串而不是数组
Velocity Engine split() returns String instead of Array
我正在使用 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() 是在字符串而不是数组上调用的。考虑到这一点,我想出了这个可怕的技巧:
#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 原型正在使用 Velocity Engine 1.5
[Ljava.lang.String;@6cff380
不是一个字符串引用,它是一个字符串数组引用,所以到目前为止,一切都是正常的(除了 Velocity 可以格式化数组而不是输出它的 toString() 方法)。
然后,当你在一个数组上调用 get(i)
时,你什么也得不到,而从 Velocity 1.6 开始你 应该 得到你想要的,那就是第个元素。我只是猜想你的 Velocity 版本太旧了...
我正在使用 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() 是在字符串而不是数组上调用的。考虑到这一点,我想出了这个可怕的技巧:
#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 原型正在使用 Velocity Engine 1.5
[Ljava.lang.String;@6cff380
不是一个字符串引用,它是一个字符串数组引用,所以到目前为止,一切都是正常的(除了 Velocity 可以格式化数组而不是输出它的 toString() 方法)。
然后,当你在一个数组上调用 get(i)
时,你什么也得不到,而从 Velocity 1.6 开始你 应该 得到你想要的,那就是第个元素。我只是猜想你的 Velocity 版本太旧了...