В чем разница между PropertyEditor, Formatter и Converter в Spring?

Работая с Spring MVC, оказалось, что я могу связывать свои формы по-разному, и я действительно чувствую, что теряюсь. Методы parse и printFormatter эквивалентны методам PropertyEditorSupport с другим именем (getAsText и setAsText). Точно так же я могу реализовать либо GenericConverter , либо два Converter<S,T>, чтобы делать одно и то же.

Я прочитал здесь в комментарии, что Formatters является заменой PropertyEditor, но я не нашел никакой документации, подтверждающей это, и он даже не объявлен устаревшим.

Мой вопрос: когда дело доходит до привязки данных из формы к объекту, как правильно это сделать в spring-mvc? В чем основная разница между PropertyEditor, Formatter и Converter весной? Каковы варианты использования для каждого из них? Мне кажется, что они несут одинаковую ответственность.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы помочь понять эти концепции, я бы сначала отличил специфические функции Spring от функций, предоставляемых Java.

PropertyEditors и связанные вещи определяются Спецификация 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 a Class parameter) uses ClassEditor to try to resolve the parameter to a Class 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 the CommandController.

Таким образом, PropertyEditors позволяют вам использовать более широкое количество вариантов использования.

Теперь, в мире Spring, вам также необходимо провести различие между Spring MVC и Spring Core.

Обратите внимание, что и Перерабатывать, и Форматтер определены как базовые технологии, применимые к любому варианту использования и не ограничивающиеся веб-фреймворком.

Документация Spring при описании Весеннее форматирование поля дает отличное объяснение назначения каждого API/SPI, а также того, как они связаны с PropertyEditors:

As discussed in the previous section, core.convert is a general-purpose type conversion system. It provides a unified ConversionService 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) and DataBinder use this system to bind field values. For example, when SpEL needs to coerce a Short to a Long to complete an expression.setValue(Object bean, Object value) attempt, the core.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 to String to support the view rendering process. In addition, you often need to localize String 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 to PropertyEditor 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 a Long. 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. The ConversionService provides a unified type conversion API for both SPIs.

В конкретном случае использования Spring MVC сама структура может обрабатывать простые типы, когда обработка HTTP-запросов.

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

В типичном случае использования, когда вы имеете дело с чтением и записью тела HTTP-запросов и ответов, например, при использовании @RequestBody, Spring будет использовать множество различных реализаций pre-настроенHttpMessageConverter: фактические зарегистрированные будут зависеть от вашего конфигурация и библиотеки, импортированные в ваш проект — например, Джексон. Мне не удалось найти этот пункт в документации, но вот ссылка на настоящий исходный код.

Пожалуйста, рассмотрите отзыв этот связанный вопрос SO, он может быть полезен.

Спасибо за этот удивительный ответ. Мне все стало намного понятнее, зная, к какому пакету принадлежал каждый интерфейс, теперь все имеет смысл. С другой стороны, я рад, что та же документация представила Formatter SPI в качестве альтернативы PropertyEditor, это было как раз то, что мне нужно было прочитать, плюс деталь, что она была включена в версию 3. На практике я всегда реализовывал Formatters, потому что для меня они сделал код намного проще для чтения, повторного использования и поддержки, но я не знал, был ли этот подход правильным. Спасибо!

Jaime 20.03.2022 17:27

Извините за задержку с ответом. Пожалуйста, @Jaime. Большое спасибо за ваш комментарий. Я очень рад слышать, что ответ был полезен. Поздравляю, на мой взгляд, это отличный и очень интересный вопрос.

jccampanero 20.03.2022 23:23

@jccampanero спасибо за информативный ответ. есть ли приоритет между этими тремя? В каком порядке они используются?

hatef alipoor 06.04.2022 21:22

Ты очень. добро пожаловать @hatefalipour. На самом деле нет: это будет зависеть от вашего фактического варианта использования. Чего вы пытаетесь достичь? Каков ваш фактический вариант использования?

jccampanero 06.04.2022 23:47

@jccampanero спасибо. Я только изучаю Spring и запутался, когда столкнулся с этими терминами, и ваш ответ многое прояснил. извините, что много прошу. когда мы используем @RequestBody, Spring использует HttpMessageConverter для преобразования, а когда мы используем @ModelAttribute, например, при отправке формы, Spring использует один из PropertyEditor, Formatter или Converter? правильно ли я понимаю?

hatef alipoor 07.04.2022 00:00

Другие вопросы по теме