Рубрики
Без рубрики

Редактор весенней пользовательской собственности

Посмотрите, как можно конвертировать между строками и пользовательскими объектами весной.

Автор оригинала: baeldung.

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 .