Пружинное форматирование чисел с помощью регистратора клиентов по списку номеров - PullRequest
1 голос
/ 22 февраля 2011

При весенней регистрации customerEditor для форматирования числа с заданным экземпляром numberFormat его легко применить к определенному полю в jsp, например ::

.
NumberFormat numberFormat = getNumberFormat(0, 0, 2);
PropertyEditor propertyEditor = 
    new CustomNumberEditor(Double.class, numberFormat, true);
binder.registerCustomEditor(Double.class, "myDoubleField", propertyEditor);

Это приведет к правильному формату числа на основе локали приложения (относительно запятых и точек для разделителя тысяч / десятичных дробей) и с указанными десятичными знаками до и после разделителя.

Однако, если у меня есть список неизвестного размера, содержащий двойные числа, как я могу их разумно отформатировать? Я мог бы, конечно, пробежаться по списку и зарегистрировать один для каждой записи в списке, но это кажется громоздким и неправильным.

Поскольку пружина привязывается к спискам с указателями, имена полей будут иметь имена, подобные "myDoubleField[0] .... myDoubleField[n]", что затрудняет ...

Есть ли легкий способ обойти это? Или вообще есть обходной путь?

Заранее большое спасибо, я надеюсь, что кто-то может указать мне правильное направление!

Ответы [ 3 ]

1 голос
/ 10 мая 2011

Решено путем замены старого громоздкого способа регистрации пользовательских редакторов с помощью глобального PropertyEditorRegistrar. Инициализация контроллеров с этим в конструкторе:

public myController(PropertyEditorRegistrar customPropertyEditorRegistrar) {
    this.customPropertyEditorRegistrar = customPropertyEditorRegistrar;
}

и регистрация в initBinder:

@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)   throws Exception {
    customPropertyEditorRegistrar.registerCustomEditors(binder);
}

Принудительно форматирует все элементы способом, указанным в CustomerPropertyEditorRegistrar.
Например. с двойными:

public final class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar {
    // Double
    PropertyEditor doubleEditor = getLocaleBasedNumberEditor(Double.class, true);
    registry.registerCustomEditor(double.class, doubleEditor);
    registry.registerCustomEditor(Double.class, doubleEditor);
}

Определенные поля могут быть перезаписаны старым способом, если для определенного поля требуется другое форматирование.

// Копыто

1 голос
/ 31 августа 2011

Если вы отображаете список значений в массиве / ArrayList и хотите отформатировать определенные поля в элементах, а не только общий конвертер для всех объектов Integer, вы можете сделать это:

Во-первых, пример класса, который я буду использовать:

public class ListOfTimes {
   private List<TimeStoredInSecondsSinceMidnight> times;
   public static class TimeStoredInSecondsSinceMidnight {
      private Integer id;
      private Integer currentTime;
      ...
   }
   ...
}

Представьте, что у вас есть экземпляр с добавленным в него несколько раз, а затем он добавляется в вашу модель как timesList. В цикле foreach вашего представления у вас есть что-то вроде этого:

<form:input id="time" path="times[${count.index}].currentTime" size="5"/>
<form:input id="recordId" path="times[${count.index}].id" size="5"/>

Конечно, это приведет к списку полей ввода с вашими целыми числами, но если вы примените редактор свойств следующим образом:

binder.registerCustomEditor(Integer.class, propertyEditor);

propertyEditor будет вызываться как по id, так и по currentTime, а не по желанию. Если мы добавим имя поля к вызову registerCustomEditor, оно также не будет работать (ни id, ни currentTime не редактируются с помощью propertyEditor):

binder.registerCustomEditor(Integer.class, "currentTime", propertyEditor);

Поскольку имя имеет [n] для каждого элемента ... после нахождения этого:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/validation/DataBinder.html#registerCustomEditor%28java.lang.Class,%20java.lang.String,%20java.beans.PropertyEditor%29

Чтение комментариев в приведенной выше ссылке говорит о том, что следующее будет делать то, что мы хотим:

binder.registerCustomEditor(Integer.class, "times.currentTime", propertyEditor);

id не тронут (использует редактор по умолчанию), а currentTime использует пользовательский propertyEditor.

Я знаю, что это, вероятно, старые новости для большинства разработчиков Spring MVC, но я нашел эту страницу, и я уверен, что другие тоже.

0 голосов
/ 22 февраля 2011

Все поля в этом списке должны иметь одинаковый числовой формат, верно?
Я не уверен, сработает ли это,
, но вы можете попробовать зарегистрировать редактор по умолчанию и переопределить редакторы для других полей:

<code>
binder.registerCustomEditor(Double.class, defaultEditor); 
binder.registerCustomEditor(Double.class, "field1", specificEditor1);
binder.registerCustomEditor(Double.class, "field2", specificEditor2);</p>

<p>
...