Spring BigDecimal 中的 MVC 控制器 NumberFormat 注释模式问题
Spring MVC Controller NumberFormat Annotation Pattern Issue in BigDecimal
我有一个 spring 控制器需要多个 BigDecimal
RequestParams。
我的应用程序语言环境是 en_US,但只是为了这个控制器方法,我需要在 de_DE 语言环境中绑定和转换这些 BigDecimal
参数(即。#.###,# # > DOT 用于分组,COMMA 用于小数点分隔符)。
这些 BigDecimal
值来自 UI 文本框,它们已经是 de_DE
格式。这是我的控制器代码,它因以下错误而失败:
"Failed to convert value of type 'java.lang.String' to required type
'java.math.BigDecimal'; nested exception is
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 参数。
如有任何帮助,我们将不胜感激。
谢谢。
您可以使用PropertyEditorSupport来处理表单输入,如下所示:
创建 class 扩展 PropertyEditorSupport
以将从客户端收到的字符串转换为 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();
}
}
我用以下方法解决了我的问题:
@RequestParam(value="amount1", required=false) @NumberFormat(pattern="#0,00") BigDecimal amount1
我有一个 spring 控制器需要多个 BigDecimal
RequestParams。
我的应用程序语言环境是 en_US,但只是为了这个控制器方法,我需要在 de_DE 语言环境中绑定和转换这些 BigDecimal
参数(即。#.###,# # > DOT 用于分组,COMMA 用于小数点分隔符)。
这些 BigDecimal
值来自 UI 文本框,它们已经是 de_DE
格式。这是我的控制器代码,它因以下错误而失败:
"Failed to convert value of type 'java.lang.String' to required type 'java.math.BigDecimal'; nested exception is 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 参数。
如有任何帮助,我们将不胜感激。
谢谢。
您可以使用PropertyEditorSupport来处理表单输入,如下所示:
创建 class 扩展 PropertyEditorSupport
以将从客户端收到的字符串转换为 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();
}
}
我用以下方法解决了我的问题:
@RequestParam(value="amount1", required=false) @NumberFormat(pattern="#0,00") BigDecimal amount1