Я шукаю найпростіший і найпростіший спосіб зв’язування та перетворення даних у Spring MVC. Якщо можливо, не роблячи жодної конфігурації XML.
Поки я використовував PropertyEditors так:
public class CategoryEditor extends PropertyEditorSupport {
// Converts a String to a Category (when submitting form)
@Override
public void setAsText(String text) {
Category c = new Category(text);
this.setValue(c);
}
// Converts a Category to a String (when displaying form)
@Override
public String getAsText() {
Category c = (Category) this.getValue();
return c.getName();
}
}
і
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
Це просто: обидва перетворення визначені в одному класі, а прив'язка - пряма. Якби я хотів зробити загальнообов'язкових для всіх моїх контролерів, я міг би ще додати 3 рядки в моєму XML конфігурації .
Але Spring 3.x запропонував новий спосіб зробити це, використовуючи конвертери :
У контейнері Spring ця система може використовуватися як альтернатива PropertyEditors
Скажімо, я хочу використовувати конвертери, тому що це "остання альтернатива". Мені доведеться створити два перетворювачі:
public class StringToCategory implements Converter<String, Category> {
@Override
public Category convert(String source) {
Category c = new Category(source);
return c;
}
}
public class CategoryToString implements Converter<Category, String> {
@Override
public String convert(Category source) {
return source.getName();
}
}
Перший недолік: я повинен зробити два класи. Користь: не потрібно робити це завдяки щедрістю.
Потім, як я просто пов'язую дані перетворювачі?
Другий недолік: я не знайшов простого способу (примітки чи інших програмних засобів) зробити це в контролері: нічого подібного someSpringObject.registerCustomConverter(...);
.
Єдиний спосіб, який я знайшов, був би стомлюючим, не простим, і лише щодо загальної прив'язки між контролером:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Конфігурація Java ( лише навесні 3.1+ ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
З усіма цими недоліками, навіщо використовувати перетворювачі? Я щось пропускаю? Чи є інші хитрощі, про які я не знаю?
Мене спокушає продовжити використання PropertyEditors ... Зв'язування набагато простіше і швидше.