我有以下代码:
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
getter)?答案 0 :(得分:5)
解决此问题的一些可能解决方案。
使用伪吸气器
public String getBigFieldString() {
return bigField != null ? bigField.toPlainString : null;
}
并且插件会将其序列化为bigFieldString:"12345678901234567890.123456789123456789"
。你也可以使用field的getter来做到这一点。
更改JSON插件代码
将JSON插件中的org.apache.struts2.json.JSONWriter
类复制到项目代码中。并更新process
方法,如下所示。 (这样做时要小心。)
package org.apache.struts2.json;
...
class JSONWriter {
...
private void process(Object object, Method method) throws JSONException {
this.stack.push(object);
if (object instanceof Class) {
this.string(object);
} else if (object instanceof Boolean) {
this.bool((Boolean) object);
}
// Begin: Handling of Big Decimal, Keep this code above Handling of Number
else if (object instanceof BigDecimal) {
this.string(((BigDecimal)object).toPlainString());
}
// End: Handling of Big Decimal
else if (object instanceof Number) {
this.add(object);
} else if (object instanceof String) {
this.string(object);
} else if (object instanceof Character) {
this.string(object);
} else if (object instanceof Map) {
this.map((Map) object, method);
} else if (object.getClass().isArray()) {
this.array(object, method);
} else if (object instanceof Iterable) {
this.array(((Iterable) object).iterator(), method);
} else if (object instanceof Date) {
this.date((Date) object, method);
} else if (object instanceof Calendar) {
this.date(((Calendar) object).getTime(), method);
} else if (object instanceof Locale) {
this.string(object);
} else if (object instanceof Enum) {
this.enumeration((Enum) object);
} else {
this.bean(object);
}
this.stack.pop();
}
...
}
答案 1 :(得分:1)
简短回答:
BigDecimalConverter.convertToString
未被调用,因为它未被使用。
还有其他方法可以实现这一点(没有定义相应的 字符串字段和/或字符串getter)?
不,你不能。 JavaScript不是您的语言选择,或者您可以将其用作字符串。意味着您可以通过bigdecimal.js
等方式克服语言的限制。