2014-10-06 4 views
1

해시 맵을 사용하여 bean에 대한 모든 setter 메소드를 호출하려고합니다. 키는 속성 이름이고 값은 setters를 호출하여 설정해야하는 실제 값입니다. 코드 때라도하는 문자열 proerties 완벽하게 작동하지만 INT와 같은 비 문자열 속성에 실패하는 등Java Bean 유틸리티가 비 String 유형의 모든 setter를 호출합니다.

 for(Map.Entry<String, String> entry : settings.entrySet()){ 
     try{ 
        key = entry.getKey(); 
        PropertyUtils.setProperty(bean, key, entry.getValue()); 
     } 
     catch(Exception ex) 
     { 
      LOGGER.debug("failed...."+ex.getMessage());  
     } 
    } 

위의 코드는 질문은

failed....Cannot invoke setter on bean class - argument type mismatch - had objects of type "java.lang.String" but expected signature "int" 

failed....Cannot invoke setter on bean class - argument type mismatch - had objects of type "java.lang.String" but expected signature "double" 

INT/더블 등과 같은 비 문자열 필드에 예외가 발생 더블 :이 예외를 피하는 방법,이 예외없이 setter를 성공적으로 호출하는 방법.

+1

, 문제는 무엇을 줄 수 있습니까? – hooknc

+0

질문 세부 사항과 함께 편집 됨. Txx – ATHER

답변

2

Map.Entry가 두 개의 String 튜플로로드되었으므로 setProperty에 값을 전달할 때 메소드가 int 또는 float 등을 기대할 때도 보내는 문자열이됩니다. .

이 테스트를하지 않은,하지만 당신은 그것을 시도 그래서

for(Map.Entry<String, String> entry : settings.entrySet()){ 
    try{ 
       key = entry.getKey(); 
       Class propertyClass = PropertyUtils.getPropertyDescriptor(bean, key).getPropertyType(); 
       if (propertyClass.getName().equals('Integer')) { 
        PropertyUtils.setProperty(bean, key, Integer.parseInt(entry.getValue())); 
       } // and so with other types. 
    } 
    catch(Exception ex) 
    { 
     LOGGER.debug("failed...."+ex.getMessage());  
    } 
}