BigDecimal中的Spring MVC控制器NumberFormat注释模式问题

时间:2017-02-05 19:12:50

标签: java spring spring-mvc spring-annotations numberformatexception

我有一个弹簧控制器,它需要多个BigDecimal RequestParams。

我的应用程序区域设置是en_US但是对于此控制器方法,我需要在de_DE语言环境中绑定和转换这些BigDecimal参数(即#。###,##> DOT用于分组,COMMA用于小数分离器)。

这些BigDecimal值来自UI文本框,它们已经是de_DE格式。这是我的控制器代码失败,出现以下错误:

  

"无法转换类型' java.lang.String'的值要求的类型   ' java.math.BigDecimal的&#39 ;;嵌套异常是   java.lang.NumberFormatException"

@RequestMapping(value = "/create", method = RequestMethod.POST)
public ModelAndView create(@RequestParam("referenceNumber") String referenceNumber, @RequestParam("startDate") @DateTimeFormat(pattern="dd-MM-yyyy") Date startDate, @RequestParam("amount1") @NumberFormat(pattern = "#.###,##") BigDecimal amount1, @RequestParam("amount2") @NumberFormat(pattern = "#.###,##") BigDecimal amount2) {

    // Do something and return

}

Spring以某种方式忽略了我的数字格式。请注意DateTimeFormat注释按预期工作;以正确的形式解析startDate参数。

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:4)

您可以使用PropertyEditorSupport来处理表单输入,如下所示:

创建扩展PropertyEditorSupport的类,将从客户端收到的String转换为BigDecimal,例如:

import java.beans.PropertyEditorSupport;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class BigDecimalEditor extends PropertyEditorSupport {

    public void setAsText(String text) {
        NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMAN);
        try {
            Number number = formatter.parse(text);
            BigDecimal bigDecimal = BigDecimal.valueOf(number.doubleValue());
            setValue(bigDecimal);
        } catch (ParseException e) {
            // handle exception here
        }
    }
}

并将其与控制器绑定,如下:

@RestController
@RequestMapping(value = "/employee")
public class EmployeeController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(BigDecimal.class, new BigDecimalEditor());
    }

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public ModelAndView create(
            @RequestParam("amount") @NumberFormat(pattern = "#.###,##") BigDecimal amount) {
        System.out.println(amount);
        return new ModelAndView();
    }
}

答案 1 :(得分:2)

我解决了我的问题: @RequestParam(value="amount1", required=false) @NumberFormat(pattern="#0,00") BigDecimal amount1