Весенний формат отображения и формат редактирования - PullRequest
0 голосов
/ 01 октября 2018

Фон

У меня есть небольшой веб-проект Spring MVC (со стандартными JSP в качестве механизма просмотра), и я решил, что было бы неплохо, чтобы булевы значения отображались как "да" или "нет"- Думаю, это выглядит более дружелюбно, чем «правда» и «ложь».Поэтому я создал пользовательский BooleanFormatter, чтобы сделать это для меня.Пока все хорошо.

Однако, когда логическое поле отображается как флажок, Spring делает следующее, чтобы определить, должен ли флажок быть установлен:

  1. Преобразовать логическое значениена «да» или «нет».
  2. Проверьте результат применения Boolean.valueOf к этому.

Конечно, Boolean.valueOf("yes") - это false, и поэтому флажки будутникогда не будет отображаться как проверено.

Это проблема.

Мой вопрос

Есть ли способ сообщить Spring, что форматер должен only использоваться при отображении значения,а не при рендеринге (или разборе значения) редактора?

(я ищу что-то похожее на DisplayTemplate ASP.NET MVC против EditorTemplate, или DisplayFormat.ApplyFormatInEditMode)

Или я полностью ошибаюсь в этом?

1 Ответ

0 голосов
/ 02 октября 2018

Я посмотрел код AbstractPropertyBindingResult, чтобы понять, почему ответ на Spring флажок JSP Tag не работает, когда работает конвертер для типа Boolean .Этот код используется при рендеринге флажка / другого ввода:

protected Object formatFieldValue(String field, @Nullable Object value) {
    String fixedField = fixedField(field);
    // Try custom editor...
    PropertyEditor customEditor = getCustomEditor(fixedField);
    if (customEditor != null) {
        customEditor.setValue(value);
        String textValue = customEditor.getAsText();
        // If the PropertyEditor returned null, there is no appropriate
        // text representation for this value: only use it if non-null.
        if (textValue != null) {
            return textValue;
        }
    }
    if (this.conversionService != null) {
        // Try custom converter...
        TypeDescriptor fieldDesc = getPropertyAccessor().getPropertyTypeDescriptor(fixedField);
        TypeDescriptor strDesc = TypeDescriptor.valueOf(String.class);
        if (fieldDesc != null && this.conversionService.canConvert(fieldDesc, strDesc)) {
            return this.conversionService.convert(value, fieldDesc, strDesc);
        }
    }
    return value;
}

Во время привязки данных, аналогичный процесс,

  1. Попробуйте найти PropertyEditor.
  2. Попробуйте найти Converter / Formatter

Поэтому:

  • Чтобы указать формат только для редакторов, используйте PropertyEditor.
  • Чтобы указать формат только для отображения, используйте Formatter или Converter, но также используйте PropertyEditor для поведения по умолчанию.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...