coldfusion imageDraw java.lang.Double无法转换为java.lang.String

时间:2019-07-04 18:13:28

标签: coldfusion cfimage

我正在与imageDraw合作,但遇到一个奇怪的错误。如果我只是插件值,并且不尝试使用我从其他地方获取的值,那么它可以工作,但是我必须从其他位置绘制边距和线高的值并进行计算。

 x = 50;
 y = 800;
 newImg = imageNew("", x, y);
 imageSetAntialiasing(newImg, true);
 setup['size'] = lineHeight*dpi;
 setup['font'] = "Arial";
 imageDrawText(newImg,img.text,topMargin,leftMargin,setup);

当我将imageDrawText中的每个元素放在单独的行上时,错误指向属性集合(设置)。我确实尝试过

setup['size'] = "#lineHeight*dpi#";

但是它也不起作用。

调试顶部的完整错误消息:

  

处理请求时发生错误

     

投射的对象时出错   类型java.lang.Double不能强制转换为java.lang.String   不兼容的类型。这通常表示Java中存在编程错误,   尽管这也可能意味着您尝试在其中使用异物   与设计不同的方式。 java.lang.Double不能是   强制转换为java.lang.String

2 个答案:

答案 0 :(得分:4)

在较旧的ColdFusion版本中(在ColdFusion 2016之前),这是一个错误,因为size属性被显式强制转换为:(String)size。并且即使您将值作为String传递,您的值也可能不包含小数位,因为ColdFusion尝试将值解析为Integer:Integer.parseInt((String)size)

// works
setup['size'] = "12";

// works, because literal numbers are casted to String
setup['size'] = 12;

// DOES NOT work, because any math calculation results into a Double
setup['size'] = 12 * 1;

// DOES NOT work, because this is a Double
setup['size'] = 12.1;

您使用setup['size'] = toString(int(...));的解决方案是解决此错误的正确方法。 int()确保没有小数位结尾(防止NumberFormatException),toString()确保传递字符串(防止ClassCastException)。

(这篇文章更像是一条评论,但评论太久了。请随意接受自己的回答。)

答案 1 :(得分:1)

关于寻求帮助的事情为我打开了渠道。找到了解决方案。问题的确是属性集合的setup.size部分。这是有效的方法:

setup['size'] = toString(int(lineHeight*dpi));

不知道为什么要特别指定它为字符串。似乎有点愚蠢,因为我们将其用作数字。