我有一个弹簧控制器,它需要多个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参数。
任何帮助都将不胜感激。
感谢。
答案 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