我有以下代码:
xwork-conversion.properties
java.math.BigDecimal=demo.BigDecimalConverter
BigDecimalConverter.java
package demo;
import java.math.BigDecimal;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class BigDecimalConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class clazz) {
System.out.println("BigDecimal : Converting from String : " + values[0]);
return new BigDecimal(values[0]);
}
@Override
public String convertToString(Map context, Object value) {
String str = ((BigDecimal)value).toPlainString();
System.out.println("BigDecimal : Converted to String : " + str);
return str;
}
}
TheAction.java
package demo;
//imports...
public class TheAction extends ActionSupport {
private BigDecimal bigField; //with getter and setter
public String execute() {
return SUCCESS;
}
}
struts.xml
<package name="demo" extends="json-default">
<action name="processBig" class="demo.TheAction">
<result type="json"/>
</action>
</package>
观察
当请求用一些大的小数说提交时"12345678901234567890.123456789123456789"
,方法convertFromString
被执行并将值转换为字符串并打印
BigDecimal : Converting from String : 12345678901234567890.123456789123456789
但是当解析响应时,方法convertToString
不会被执行,因为它没有在标准输出上记录预期的行。Struts2 内部转换BigDecimal
为String
并返回以下响应。
{"bigField":12345678901234567890.123456789123456789}
当在 JavaScript 中接收到响应时,它就变成12345678901234567000
了一个巨大的价值损失。
问题:
- 为什么
BigDecimalConverter.convertToString
不被调用? - 有没有其他方法可以实现这一点(不定义相应
String
的字段和/或String
吸气剂)?