Tôi đang tìm cách dễ nhất và đơn giản nhất để liên kết và chuyển đổi dữ liệu trong Spring MVC. Nếu có thể, không cần thực hiện bất kỳ cấu hình xml.
Cho đến nay tôi đã sử dụng PropertyEditor như vậy:
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();
}
}
và
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
Rất đơn giản: cả hai chuyển đổi đều được định nghĩa trong cùng một lớp và ràng buộc là đơn giản. Nếu tôi muốn thực hiện một ràng buộc chung trên tất cả các bộ điều khiển của mình, tôi vẫn có thể thêm 3 dòng trong cấu hình xml của mình .
Nhưng Spring 3.x đã giới thiệu một cách mới để làm điều đó, bằng cách sử dụng Trình chuyển đổi :
Trong một thùng chứa Spring, hệ thống này có thể được sử dụng thay thế cho PropertyEditor
Vì vậy, hãy nói rằng tôi muốn sử dụng Trình chuyển đổi vì đây là "sự thay thế mới nhất". Tôi sẽ phải tạo hai bộ chuyển đổi:
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();
}
}
Hạn chế đầu tiên: tôi phải làm hai lớp. Lợi ích: không cần phải đúc nhờ sự hào phóng.
Sau đó, làm thế nào để tôi đơn giản dữ liệu liên kết các bộ chuyển đổi?
Hạn chế thứ hai: Tôi chưa tìm thấy bất kỳ cách đơn giản nào (chú thích hoặc các phương tiện lập trình khác) để thực hiện điều đó trong bộ điều khiển: không có gì giống như someSpringObject.registerCustomConverter(...);
.
Các cách duy nhất tôi tìm thấy sẽ tẻ nhạt, không đơn giản và chỉ về ràng buộc bộ điều khiển chéo chung:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Cấu hình Java ( chỉ trong Spring 3.1+ ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
Với tất cả những nhược điểm này, tại sao nên sử dụng Converters? Tui bỏ lỡ điều gì vậy ? Có những thủ thuật khác mà tôi không nhận thức được?
Tôi muốn tiếp tục sử dụng PropertyEditor ... Binding dễ dàng và nhanh chóng hơn nhiều.