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());
}
...
}
간단합니다. 두 변환 모두 동일한 클래스에 정의되어 있으며 바인딩은 간단합니다. 모든 컨트롤러에서 일반 바인딩을 원한다면 여전히 xml config에 3 줄을 추가 할 수 있습니다 .
그러나 Spring 3.x는 Converters를 사용하여 새로운 방법을 도입했습니다 .
스프링 컨테이너 내에서이 시스템은 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(...);
.
내가 찾은 유일한 방법은 지루하고 단순하지 않으며 일반적인 크로스 컨트롤러 바인딩에만 관한 것입니다.
XML 설정 :
<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()); } }
이 모든 단점을 가지고 왜 변환기를 사용 하는가? 뭔가 빠졌습니까? 내가 모르는 다른 트릭이 있습니까?
PropertyEditors를 계속 사용하고 싶습니다 ... 바인딩이 훨씬 쉽고 빠릅니다.