2011-02-10 5 views
4

예를 들어, java.util.Map의 모든 인스턴스에 대해 Converter를 등록하려면이 작업을 수행하는 방법이 있습니까?Commons BeanUtils를 사용할 때 특정 클래스의 모든 하위 클래스에 대해 Converter를 등록하는 가장 좋은 방법은 무엇입니까?

new BeanUtilsBean().getConvertUtils().register(new MyConverter(), Map.class); 

여기서 MyConverter#convert() 메서드는 Map 인스턴스에 대해 호출됩니다. 예를 들어 HashMap)?

이 배경은 BeanUtils를 사용하여 데이터베이스에서 여러 가지 다른 빈을 채우는 것입니다. 해당 속성 중 일부는 특정 인터페이스를 구현하는 열거 형이며 값을 설정하기 위해 사용자 지정 루틴이 필요합니다. 문제의 인터페이스 구현에 대해 하나의 변환기 클래스를 등록하려고했지만이 작업을 수행 할 방법을 찾을 수 없었기 때문에 콩의 모든 속성 클래스를 검사하여 즉시 수행해야했습니다.

이것은 다소 불쾌한 것처럼 보입니다.이 작업을 수행하는 더 좋은 방법이 분명있을 것입니다.

답변

6

ConvertUtilsBean을 무시할 수 있습니다. 다음 코드는 Enum에 대한 지원을 추가합니다,하지만 당신은 Map에 대해 동일한 작업을 수행 할 수 있습니다

BeanUtilsBean.setInstance(new BeanUtilsBean(new EnumAwareConvertUtilsBean())); 

클래스 정의 : http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/

+0

에서

public class EnumAwareConvertUtilsBean extends ConvertUtilsBean2 { private static final EnumConverter ENUM_CONVERTER = new EnumConverter(); @Override public Converter lookup(Class pClazz) { final Converter converter = super.lookup(pClazz); if (converter == null && pClazz.isEnum()) { return ENUM_CONVERTER; } else { return converter; } } } public class EnumConverter extends AbstractConverter { private static final Logger LOGGER = LoggerFactory.getLogger(EnumConverter.class); @Override protected String convertToString(final Object pValue) throws Throwable { return ((Enum) pValue).name(); } @Override protected Object convertToType(final Class pType, final Object pValue) throws Throwable { // NOTE: Convert to String is handled elsewhere final Class<? extends Enum> type = pType; try { return Enum.valueOf(type, pValue.toString()); } catch (final IllegalArgumentException e) { LOGGER.warn("No enum value \"" + pValue + "\" for " + type.getName()); } return null; } @Override protected Class getDefaultType() { return null; } } 

나는 블로그 게시물을 읽고 솔루션을 가지고 및 의견 매우 유망 해 보입니다 - 감사합니다! ( '개인 클래스 EnumConverter 변환기 { @Override 공공 T 변환 (클래스 종류, 개체 값) { 반환 type.cast를 구현 type.getMethod : 자바 6/7 및 제네릭 –

+0

는 EnumConverter 같은 일이되고있다 ("fromValue", String.class) .invoke (null, value.toString())); } }'. 그러나 나는 반성을 제거 할 수 없었다. – Francois

2

내 사용 사례는 모든 유형의 열거 형에 대한 공통 변환기 였지만 코드에서 볼 수있는 것에서부터 ConvertUtils는 변환기와 클래스 간의 직접 매핑 만 지원하며 등록 할 방법이 없습니다. 기본 클래스 또는 인터페이스

기본적으로 키가 클래스이고 값이 변환기 인지도를 사용하고 있으며 클래스에서 기반으로하는 적절한 변환기를 얻으려면 Map # get을 수행하면됩니다.

관련 문제