1. Введение
Проще говоря, Spring использует редакторы свойств в значительной степени для управления преобразованием между Струнные ценности и пользовательские Объект типы; это основано на Java фасоль PropertyEditor .
В этом учебнике мы пройдемся по двум различным случаям использования для демонстрации автоматическая привязка редактора свойств и пользовательский редактор свойств, связывающий .
2. Автоматическое связывание редактора свойств
Стандартный JavaBeans инфраструктура автоматически откроет для себя НедвижимостьИмущество классы, если они находятся в том же пакете, что и класс, который они обрабатывают. Кроме того, они должны иметь то же имя, что и класс плюс Редактор суффикс.
Например, если мы создадим КредитКарта класс модели, то мы должны назвать класс редактора CreditCardEditor.
Давайте теперь пройдите через практический пример привязки свойств.
В нашем сценарии мы перейдем номер кредитной карты в качестве переменной пути в URL-адресе запроса, и мы связываем это значение как кредитная карта объект.
Давайте сначала создадим КредитКарта тип модели, определяющий поля rawCardNumber, Идентификационный номер банка (первые 6-значные), номер счета (цифры от 7 до 15) и чек-код (последняя цифра):
public class CreditCard { private String rawCardNumber; private Integer bankIdNo; private Integer accountNo; private Integer checkCode; // standard constructor, getters, setters }
Далее мы создадим CreditCardEditor класс. Это реализует бизнес-логику для преобразования номера кредитной карты, данного в качестве Струнные к КредитКарта объект.
Класс редактора свойств должен расширяться НедвижимостьИмуществоподдерживаемое и реализовать getAsText() и setAsText() методика:
public class CreditCardEditor extends PropertyEditorSupport { @Override public String getAsText() { CreditCard creditCard = (CreditCard) getValue(); return creditCard == null ? "" : creditCard.getRawCardNumber(); } @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { setValue(null); } else { CreditCard creditCard = new CreditCard(); creditCard.setRawCardNumber(text); String cardNo = text.replaceAll("-", ""); if (cardNo.length() != 16) throw new IllegalArgumentException( "Credit card format should be xxxx-xxxx-xxxx-xxxx"); try { creditCard.setBankIdNo( Integer.valueOf(cardNo.substring(0, 6)) ); creditCard.setAccountNo( Integer.valueOf( cardNo.substring(6, cardNo.length() - 1)) ); creditCard.setCheckCode( Integer.valueOf( cardNo.substring(cardNo.length() - 1)) ); } catch (NumberFormatException nfe) { throw new IllegalArgumentException(nfe); } setValue(creditCard); } } }
тем getAsText() метод называется при сериализации объекта струна пока setAsText() используется для преобразования струна на другой объект.
Поскольку эти классы расположены в одном пакете, нам не нужно делать ничего другого для связывания Редактор для типа КредитКарта .
Теперь мы можем разоблачить это как ресурс в API REST; операция принимает номер кредитной карты в качестве переменной пути запроса, и Spring свяжет это текстовое значение как ДовериеКард объект и передать его в качестве аргумента метода:
@GetMapping(value = "/credit-card/{card-no}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public CreditCard parseCreditCardNumber( @PathVariable("card-no") CreditCard creditCard) { return creditCard; }
Например, для примера запроса URL-адрес /недвижимость-редактор/кредитная карта/1234-1234-1111-0019, Мы получим ответ:
{ "rawCardNumber": "1234-1234-1111-0011", "bankIdNo": 123412, "accountNo": 341111001, "checkCode": 9 }
3. Связывание редактора пользовательской собственности
Если у нас нет требуемого класса типа и класса редактора свойств в одном пакете или с ожидаемыми конвенциями именования, нам придется определить пользовательскую привязку между требуемым типом и редактором свойств.
В нашем пользовательском сценарии связывания редактора свойств Струнные значение будет передано в URL в качестве переменной пути, и мы связываем это значение как ЭкзотикаТип объект, который просто сохраняет значение в качестве атрибута.
Как и в разделе 2, давайте сначала создадим модельный класс Экзотический тип:
public class ExoticType { private String name; // standard constructor, getters, setters }
И наш пользовательский класс редактора свойств CustomExoticTypeИзохит который снова расширяет НедвижимостьИмуществоПоддержива :
public class CustomExoticTypeEditor extends PropertyEditorSupport { @Override public String getAsText() { ExoticType exoticType = (ExoticType) getValue(); return exoticType == null ? "" : exoticType.getName(); } @Override public void setAsText(String text) throws IllegalArgumentException { ExoticType exoticType = new ExoticType(); exoticType.setName(text.toUpperCase()); setValue(exoticType); } }
С весны не может обнаружить редактор свойств, Нам нужен метод, аннотированный @InitBinder в нашем Контроллер класс, регистрируемый редактором:
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(ExoticType.class, new CustomExoticTypeEditor()); }
Тогда мы можем привязать пользовательский ввод к ЭкзотикаТип объект:
@GetMapping( value = "/exotic-type/{value}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public ExoticType parseExoticType( @PathVariable("value") ExoticType exoticType) { return exoticType; }
Для url-адреса запроса /недвижимость-редактор/экзотический тип/страсть-фрукты, Мы получим ответ образца:
{ "name": "PASSION-FRUIT" }
4. Заключение
В этой быстрой статье мы увидели, как мы могли бы использовать автоматическую и пользовательскую редакцию свойств, связывающую для преобразования читаемых человеком Струнные значения для сложных типов Java.
Полный исходный код наших примеров здесь, как всегда, более на GitHub .