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

Ahm*_*met 3 java spring spring-mvc spring-annotations numberformatexception

我有一个采用多个BigDecimalRequestParams的弹簧控制器。

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

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

“未能将‘java.lang.String’类型的值转换为所需类型‘java.math.BigDecimal’;嵌套异常为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

}
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激。

谢谢。

Arp*_*wal 5

您可以使用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1这对我来说是最好的方法,但是您可以注册一个全局初始化绑定器,这样您就不必为每个控制器注册一个(http://keenformatics.blogspot.it/2013/08/how-to-create -global-initbinder-in-spring.html)。并且不需要在控制器参数中使用“NumberFormat”注释,“CustomEditor”也将在没有注释的情况下转换金额。 (2认同)