Главная » Spring » Пользовательские редакторы свойств Spring

0

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

с использованием фабричного компонента JaxRpcPortProxyFactoryBean. Одно из свойств JaxRpcPortProxyFactoryBean, которое нужно устано- вить, – это wsdlDocumentUrl. Это свойство имеет тип java.net.URL. Но вместо того чтобы создавать компонент java.net.URL и внедрять его в это свойство, можно сконфигурировать его, используя строку, как показано ниже:

<property name="wsdlDocumentUrl" value="http://www.xmethods.net/sd/BabelFishService.wsdl" />

За кулисами фреймворк Spring преобразует строковое значение в объект URL. В действительности суть этого трюка не в каких-то осо- бых возможностях Spring, а скорее в малоизвестной возможности оригинального  JavaBeans  API.  Интерфейс  java.beans.PropertyEditor позволяет определять, как значения типа String должны отображать- ся в значения других типов. Удобная реализация этого интерфейса, java.beans.PropertyEditorSupport, имеет два метода, интересующие нас:

#  getAsText()    возвращает  строковое  представление  значения

свойства;

# setAsText(String  value) присваивает свойству компонента зна- чение, переданное в виде строки.

При попытке присвоить нестроковому свойству значение типа String вызывается метод setAsText() для выполнения преобразова- ния. Точно так же, когда требуется получить строковое представле- ние значения свойства, вызывается метод getAsText().

В состав Spring входит несколько собственных редакторов, осно- ванных на PropertyEditorSupport, включая org.springframework.beans. propertyeditors.URLEditor,  который  преобразует  строковые  значения в объекты java.net.URL и обратно. В табл. 3.1 приводится выбороч- ный список редакторов, входящих в состав Spring.

Таблица 3.1. В состав Spring входят несколько собственных редакторов свойств, которые автоматически преобразуют внедряемые строковые значения в более сложные типы

Редактор

Описание

ClassEditor

Устанавливает свойство типа java.lang.Class на ос- нове строки, содержащей полное имя класса

CustomDateEditor

Устанавливает свойство типа java.util.Date на ос- нове строки и с использованием пользовательского объекта java.text.DateFormat

Таблица 3.1 (окончание)

Редактор

Описание

FileEditor

Устанавливает свойство типа java.io.File на основе строки, содержащей полный путь к файлу

LocaleEditor

Устанавливает свойство типа java.util.Locale на ос- нове строки, содержащей текстовое представление локали (например, en_US)

StringArrayPropertyEditor

Преобразует строку с подстроками, разделенными запятыми, в массив строк

StringTrimmerEditor

Автоматически отсекает пробелы у строковых свойств. Пустые строки могут быть преобразованы в значение null

URLEditor

Устанавливает свойство типа java.net.URL на основе строки, содержащей адрес URL

В дополнение к обычным редакторам, перечисленным в табл. 3.1, можно написать собственный редактор, расширяя класс Property- EditorSupport. Например, допустим, что в приложении имеется ком- понент Contact, который удобно использовать для хранения инфор- мации о сотрудниках в организации. Кроме всего прочего, объект Contact имеет свойство phoneNumber, хранящее номер телефона:

public  Contact  {

private PhoneNumber phoneNumber;

public void setPhoneNumber(PhoneNumber phoneNumber) { this.phoneNumber = phoneNumber;

}

}

Свойство phoneNumber имеет тип PhoneNumber и определяется следую- щим образом:

public PhoneNumber {

private String areaCode; private  String  prefix; private String number;

public  PhoneNumber()  {  }

public PhoneNumber(String areaCode, String prefix,

String  number)  { this.areaCode  =  areaCode;

}

}

this.prefix   =   prefix; this.number = number;

Используя базовый прием связывания, описанный в главе 2, свя- зать объект PhoneNumber со свойством phoneNumber в компоненте Contact можно следующим образом:

<beans>

<bean id="infoPhone"

class="com.springinaction.chapter03.propeditor.PhoneNumber">

<constructor-arg value="888" />

<constructor-arg value="555" />

<constructor-arg value="1212" />

</bean>

<bean id="contact"

class="com.springinaction.chapter03.propeditor.Contact">

<property name="phoneNumber" ref="infoPhone" />

</bean>

</beans>

Обратите внимание, что требуется определить отдельный компо- нент infoPhone, настроить объект PhoneNumber и затем связать свойство phoneNumber с определением компонента.

Допустим, что вместо этого вы написали свой редактор PhoneEditor, как показано ниже:

public  class  PhoneEditor

extends  java.beans.PropertyEditorSupport  {

public  void  setAsText(String  textValue)  {

String   stripped   =   stripNonNumeric(textValue);

String   areaCode   =   stripped.substring(0,3); String   prefix   =   stripped.substring(3,6); String  number  =  stripped.substring(6);

PhoneNumber  phone  =  new  PhoneNumber(areaCode,  prefix,  number); setValue(phone);

}

private String stripNonNumeric(String original) {

StringBuffer  allNumeric  =  new  StringBuffer();

for(int  i=0;  i<original.length();  i++)  { char  c  =  original.charAt(i); if(Character.isDigit(c))    {

allNumeric.append(c);

}

}

return allNumeric.toString();

}

}

Теперь единственное, что осталось сделать, – заставить фрейм- ворк Spring использовать пользовательский редактор свойств при связывании свойств компонентов. Для этого следует использовать CustomEditorConfigurer. CustomEditorConfigurer – это BeanFactoryPostPro- cessor, который загружает пользовательский редактор в BeanFactory, вызывая метод registerCustomEditor(). (При желании можно вызвать метод registerCustomEditor() в своем программном коде, после созда- ния экземпляра фабрики компонентов).

Следующий фрагмент XML-кода в файле конфигурации компо- нента подскажет фреймворку Spring о необходимости зарегистриро- вать PhoneEditor в качестве пользовательского редактора:

<bean

class="org.springframework.beans.factory.config.СustomEditorConfigurer">

<property name="customEditors">

<map>

<entry    key="com.springinaction.chapter03.propeditor.PhoneNumber">

<bean id="phoneEditor" class="com.springinaction.chapter03.propeditor.PhoneEditor">

</bean>

</entry>

</map>

</property>

</bean>

Теперь вы сможете сконфигурировать свойство phoneNumber объ- екта Contact, используя простое строковое значение и не создавая отдельный компонент infoPhone:

<bean id="contact"

class="com.springinaction.chapter03.propeditor.Contact">

<property  name="phoneNumber"  value="888-555-1212"  />

</bean>

Обратите внимание, что многие редакторы, входящие в состав фреймворка Spring (такие как URLEditor и LocaleEditor), к моменту запус- ка контейнера уже будут зарегистрированы в фабрике компонентов. Их не требуется регистрировать явно, используя CustomEditorConfigurer.

Редакторы свойств – это лишь один из способов повлиять на по- рядок создания и внедрения компонентов в Spring. Существуют и другие типы компонентов, выполняющие в контейнере Spring осо- бые функции. В следующем разделе будет показано, как создать несколько специальных компонентов, позволяющих управлять про- цессом связывания компонентов в контейнере Spring.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии