2014-03-30 6 views
2

예.BeanUtils는 체인 세터에서 작동하지 않습니다.

class tester 
{ 
    @Test 
    public void testBeanUtils() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException 
    { 
     Stranger stranger = new Stranger(); 
     BeanUtils.setProperty(stranger,"name","wener"); 
     BeanUtils.setProperty(stranger,"xname","xwener"); 
     BeanUtils.setProperty(stranger,"yname","ywener"); 

     System.out.println(stranger); 
    } 
    @Data// lombok annotation generate all setter and getter 
    public static class Stranger 
    { 
     @Accessors(chain = true)// generate chained setter 
     String name; 
     String xname; 
     String yname; 

     public Stranger setYname(String yname)// no lombok, still not work 
     { 
      this.yname = yname; 
      return this; 
     } 
    } 
} 

내 출력 :

TestValues.Stranger(name=null, xname=xwener, yname=null) 

이 문제점은 무엇입니까? 체인 세터는 좋은 것입니다. 아무 제안 사항이 있습니까?

돌아 가기 나는 Accessors chain 제거 할 수없는이 문제 오빠를 화나게 했지 시간에

편집. 이제는 commons-lang3을 사용합니다.

// force access = true is required 
Field field = FieldUtils.getField(bean.getClass(), attrName, true); 
field.set(bean,value); 

같은 문제가있는 사람들에게. 간단

답변

3

: BeanUtils 오히려 이상한 등이 사용 Introspector입니다 : 몇 가지 예외를 선언

BeanUtils.setProperty 있지만, 재산의 비 존재 설정할 수 silently ignore 것으로 보인다. 궁극적 인 원인은 Introspector이며 단순히 requires 세터의 공백을 나타냅니다.

나는 이것을 설계대로 부르 겠지만, YMMV. 그것은 오래된 클래스이고 유창한 인터페이스는 어두운 시간에 아직 발명되지 않았습니다. 연결을 해제하려면 Accessors(chain=false)을 사용하십시오.


더 중요한 것은 Use the source입니다. 그것을 가져 와서 디버거를 얻으십시오. (IDE에 있습니다.) 직접 찾으십시오. (작동하지 않는지 묻고 조금 더 열심히 노력하십시오.)

. "유창한 API 시나리오에서 사용되는 속성에 대한 쓰기 방법을 감지 할 수 BeanIntrospector 인터페이스의 구현"

+0

https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/FluentPropertyBeanIntrospector.html

아마 BeanHelper 여기에 사용할 수 있습니다. Fluent 인터페이스 INstrospector를 사용하는 것 같습니다. https://apache.googlesource.com/commons-configuration/+/b5ef1eb1a7dd34a06cf68dae4bfcada9e1121818/src/main/java/org/apache/commons/configuration/beanutils/BeanHelper.java –

+0

탱크, [BeanUtils2]를 기다리는 체인을 이미 비활성화했습니다. (http://commons.apache.org/sandbox/commons-beanutils2/) – wener

3

당신은 FluentPropertyBeanIntrospector 구현을 사용할 수 있습니다

PropertyUtils.addBeanIntrospector(new FluentPropertyBeanIntrospector()); 

     BeanUtils.setProperty(this.o, "property", "value");