次のコードがあります。
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
ゲッターを定義せずに)?