我有一个 AbstractSingleBeanDefinitionParser 的自定义实现,允许我在我的 spring 配置中定义 3D 矢量,而无需其他方式。
<rbf:vector3d id="test_vector" delimeter=";" value="45;46;47"/>
效果很好,我已经使用了几个月没有任何问题。昨天我试图在 .properties 文件中定义值,如下所示:
在 test.properties 我有:
vector3d.value=1,2,3
在xml文件中我有:
<context:property-placeholder location="test.properties"/>
<rbf:vector3d id="test_vector_with_properties" delimeter="," value="${vector3d.value}"/>
当我尝试运行我的单元测试时,它崩溃了,我得到了这个异常:
Caused by: java.lang.NumberFormatException: For input string: "${vector3d.value}"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
at java.lang.Double.parseDouble(Double.java:510)
at scala.collection.immutable.StringLike$class.toDouble(StringLike.scala:234)
at scala.collection.immutable.StringOps.toDouble(StringOps.scala:31)
at rb.foundation.spring.xml.Vector3DBeanDefinitionParser$$anonfun$1.apply(Vector3DBeanDefinitionParser.scala:25)
当我将 .properties 文件用于普通 bean 时,它工作得很好,这让我相信我在实现解析器时忽略了一个微妙之处。它是用 scala 编写的,但您应该能够遵循它:
class Vector3DBeanDefinitionParser extends AbstractSingleBeanDefinitionParser
{
override def getBeanClass(element : Element) = classOf[Vector3D]
override def doParse(element: Element, builder: BeanDefinitionBuilder)
{
val delim = element.getAttribute("delimeter")
val value = element.getAttribute("value")
val values = value.split(delim).map(_.toDouble)
builder.addConstructorArgValue(values(0))
builder.addConstructorArgValue(values(1))
builder.addConstructorArgValue(values(2))
}
}
如有必要,我很乐意添加密钥替换,我只需要知道在哪里/如何做。
想法?