ฉันกำลังมองหาวิธีที่ง่ายและง่ายที่สุดในการผูกและแปลงข้อมูลใน 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
สมมติว่าฉันต้องการใช้ Converters เพราะเป็น "ทางเลือกใหม่ล่าสุด" ฉันจะต้องสร้างตัวแปลงสองตัว:
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 ( เฉพาะใน Spring 3.1+ ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
ด้วยข้อเสียเหล่านี้ทำไมต้องใช้ Converters? ฉันพลาดอะไรไปรึเปล่า ? มีเทคนิคอื่น ๆ ที่ฉันไม่ทราบหรือไม่?
ฉันอยากจะใช้ PropertyEditors ต่อไป ... การผูกง่ายและเร็วกว่ามาก