복붙노트

[SPRING] Spring MVC Controller NumberFormat BigDecimal의 주석 패턴 문제

SPRING

Spring MVC Controller NumberFormat BigDecimal의 주석 패턴 문제

여러 BigDecimal RequestParams를 사용하는 스프링 컨트롤러가 있습니다.

내 응용 프로그램 로케일은 en_US이지만이 컨트롤러 메서드의 경우 de_DE 로캘에서 이러한 BigDecimal 매개 변수를 바인딩하고 변환해야합니다 (예 : #. ###, ##> DOT, 소수점 구분 기호는 COMMA).

이러한 BigDecimal 값은 UI 텍스트 상자에서 나오며 이미 de_DE 형식입니다. 다음은 다음 오류로 인해 실패하는 컨트롤러 코드입니다.

@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

}

봄은 어떻게 든 내 numberformat 패턴을 무시합니다. DateTimeFormat 주석은 예상대로 작동합니다. startDate 매개 변수를 올바른 형식으로 파싱합니다.

어떤 도움을 주시면 감사하겠습니다.

감사.

해결법

  1. ==============================

    1.PropertyEditorSupport를 사용하여 다음과 같이 양식 입력을 처리 할 수 ​​있습니다.

    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();
        }
    }
    
  2. ==============================

    2.나는 내 문제를 해결했다 : @RequestParam (value = "amount1", required = false) @NumberFormat (패턴 = "# 0,00") BigDecimal amount1

    나는 내 문제를 해결했다 : @RequestParam (value = "amount1", required = false) @NumberFormat (패턴 = "# 0,00") BigDecimal amount1

  3. from https://stackoverflow.com/questions/42056112/spring-mvc-controller-numberformat-annotation-pattern-issue-in-bigdecimal by cc-by-sa and MIT license