2

У меня есть контроллер пружины, который принимает несколько BigDecimal RequestParams.Spring MVC Controller NumberFormat Аннотация Проблема с шаблоном в BigDecimal

Мой локаль применения - en_US, но только для этого метода контроллера. Мне нужно связать и преобразовать эти параметры BigDecimal в de_DE locale (т.е. #. ###, ##> DOT для группировки и COMMA для десятичного разделителя).

Эти значения BigDecimal исходят из текстовых полей пользовательского интерфейса, и они уже находятся в формате 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 каким-то образом игнорирует мой шаблон NumberFormat. Обратите внимание, что аннотация DateTimeFormat работает должным образом; разбор параметра startDate в правильной форме.

Любая помощь будет оценена по достоинству.

Спасибо.

+0

Вы можете отлаживать часть кода JavaScript. Наверное, вы отправляете строковое значение. Вы можете указать его в свой код javascript –

+0

@ user3087839 javascript здесь неактуальен; конечно, я отправляю кучу строк со стороны просмотра. Отправка формы - это способ отправки строкового ключа, пары значений с одной стороны на другую. Я спрашиваю, как преобразовать эти значения параметров строки обычным способом. – Ahmet

+0

Аннотация работает, потому что она дает ошибку, например NumberFormatException. Странно отправлять строку и пытаться ее форматировать позже. –

ответ

2

Вы можете использовать PropertyEditorSupport для обработки формы ввода следующим образом:

Создать класс, расширяющий 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(); 
    } 
} 
+0

Спасибо за ответ. Это своего рода обходное решение, потому что с помощью customEditors нам не нужно использовать аннотацию NumberFormat. Я действительно хотел бы знать, можно ли использовать аннотацию NumberFormat с пользовательским шаблоном, как и шаблон DateTimeFormat. – Ahmet

+1

+1 Это лучший способ для меня, но вы можете зарегистрировать глобальное связующее связующее, поэтому вам не нужно регистрировать его для каждого контроллера (http://keenformatics.blogspot.it/2013/08/how-to- создание глобального-initbinder-в-spring.html). И не нужно использовать аннотацию «NumberFormat» в параметре контроллера, «CustomEditor» также преобразует сумму без аннотации. – amicoderozer

1

Я решил свою проблему с: @RequestParam(value="amount1", required=false) @NumberFormat(pattern="#0,00") BigDecimal amount1

+0

Я применил обходное решение с PropertyEditorSupport, но я дам ему попытку и дам вам знать. Спасибо – Ahmet

+0

На самом деле то, что вы предложили, также работает. Вчера я попробовал, и он работает хорошо. – Ahmet