6

次のコードがあります。

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は内部的に変換BigDecimalStringて以下のレスポンスを返します。

{"bigField":12345678901234567890.123456789123456789}

JavaScript でレスポンスを受信すると12345678901234567000、大きな損失になります。


質問:

  • なぜBigDecimalConverter.convertToString呼び出されないのですか?
  • これを達成する他の方法はありますか(対応するStringフィールドやStringゲッターを定義せずに)?
4

2 に答える 2