Работая с Spring MVC
, оказалось, что я могу связывать свои формы по-разному, и я действительно чувствую, что теряюсь. Методы parse
и print
Formatter
эквивалентны методам PropertyEditorSupport
с другим именем (getAsText
и setAsText
). Точно так же я могу реализовать либо GenericConverter
, либо два Converter<S,T>
, чтобы делать одно и то же.
Я прочитал здесь в комментарии, что Formatters
является заменой PropertyEditor
, но я не нашел никакой документации, подтверждающей это, и он даже не объявлен устаревшим.
Мой вопрос: когда дело доходит до привязки данных из формы к объекту, как правильно это сделать в spring-mvc
? В чем основная разница между PropertyEditor
, Formatter
и Converter
весной? Каковы варианты использования для каждого из них? Мне кажется, что они несут одинаковую ответственность.
Чтобы помочь понять эти концепции, я бы сначала отличил специфические функции Spring от функций, предоставляемых Java.
PropertyEditor
s и связанные вещи определяются Спецификация JavaBeans.
Спецификация определяет API, механизмы и соглашения для работы с объектами, свойствами объектов и всем, что связано с их изменениями, как с событиями.
PropertyEditor
обычно используются в графических интерфейсах для обработки взаимодействия между пользовательским интерфейсом и базовой моделью объектов, обычно обрабатывая преобразование между значениями свойств из/в его String
представление.
Сам Spring фактически использует разные реализации PropertyEditor
и соглашения Java Beans во многих различных ситуациях. Например, из документы:
A couple of examples where property editing is used in Spring:
Setting properties on beans is done by using
PropertyEditor
implementations. When you use String as the value of a property of some bean that you declare in an XML file, Spring (if the setter of the corresponding property has aClass
parameter) usesClassEditor
to try to resolve the parameter to aClass
object.Parsing HTTP request parameters in Spring’s MVC framework is done by using all kinds of
PropertyEditor
implementations that you can manually bind in all subclasses of theCommandController
.
Таким образом, PropertyEditor
s позволяют вам использовать более широкое количество вариантов использования.
Теперь, в мире Spring, вам также необходимо провести различие между Spring MVC и Spring Core.
Обратите внимание, что и Перерабатывать, и Форматтер определены как базовые технологии, применимые к любому варианту использования и не ограничивающиеся веб-фреймворком.
Документация Spring при описании Весеннее форматирование поля дает отличное объяснение назначения каждого API/SPI, а также того, как они связаны с PropertyEditor
s:
As discussed in the previous section,
core.convert
is a general-purpose type conversion system. It provides a unifiedConversionService
API as well as a strongly typed Converter SPI for implementing conversion logic from one type to another. A Spring container uses this system to bind bean property values. In addition, both the Spring Expression Language (SpEL) andDataBinder
use this system to bind field values. For example, when SpEL needs to coerce aShort
to aLong
to complete anexpression.setValue(Object bean, Object value)
attempt, thecore.convert
system performs the coercion.Now consider the type conversion requirements of a typical client environment, such as a web or desktop application. In such environments, you typically convert from
String
to support the client postback process, as well as back toString
to support the view rendering process. In addition, you often need to localizeString
values. The more general core.convert Converter SPI does not address such formatting requirements directly. To directly address them, Spring 3 introduced a convenient Formatter SPI that provides a simple and robust alternative toPropertyEditor
implementations for client environments.In general, you can use the Converter SPI when you need to implement general-purpose type conversion logic — for example, for converting between a
java.util.Date
and aLong
. You can use the Formatter SPI when you work in a client environment (such as a web application) and need to parse and print localized field values. TheConversionService
provides a unified type conversion API for both SPIs.
В конкретном случае использования Spring MVC сама структура может обрабатывать простые типы, когда обработка HTTP-запросов.
Преобразование типов применяется автоматически на основе настроенного набора конвертеров, хотя это поведение можно настроить с помощью DataBinder
с и вышеупомянутой системы форматирования. Пожалуйста, смотрите соответствующие документы.
В типичном случае использования, когда вы имеете дело с чтением и записью тела HTTP-запросов и ответов, например, при использовании @RequestBody
, Spring будет использовать множество различных реализаций pre-настроенHttpMessageConverter
: фактические зарегистрированные будут зависеть от вашего конфигурация и библиотеки, импортированные в ваш проект — например, Джексон. Мне не удалось найти этот пункт в документации, но вот ссылка на настоящий исходный код.
Пожалуйста, рассмотрите отзыв этот связанный вопрос SO, он может быть полезен.
Извините за задержку с ответом. Пожалуйста, @Jaime. Большое спасибо за ваш комментарий. Я очень рад слышать, что ответ был полезен. Поздравляю, на мой взгляд, это отличный и очень интересный вопрос.
@jccampanero спасибо за информативный ответ. есть ли приоритет между этими тремя? В каком порядке они используются?
Ты очень. добро пожаловать @hatefalipour. На самом деле нет: это будет зависеть от вашего фактического варианта использования. Чего вы пытаетесь достичь? Каков ваш фактический вариант использования?
@jccampanero спасибо. Я только изучаю Spring и запутался, когда столкнулся с этими терминами, и ваш ответ многое прояснил. извините, что много прошу. когда мы используем @RequestBody
, Spring использует HttpMessageConverter
для преобразования, а когда мы используем @ModelAttribute
, например, при отправке формы, Spring использует один из PropertyEditor
, Formatter
или Converter
? правильно ли я понимаю?
Спасибо за этот удивительный ответ. Мне все стало намного понятнее, зная, к какому пакету принадлежал каждый интерфейс, теперь все имеет смысл. С другой стороны, я рад, что та же документация представила
Formatter SPI
в качестве альтернативыPropertyEditor
, это было как раз то, что мне нужно было прочитать, плюс деталь, что она была включена в версию 3. На практике я всегда реализовывалFormatters
, потому что для меня они сделал код намного проще для чтения, повторного использования и поддержки, но я не знал, был ли этот подход правильным. Спасибо!