Popular beans com BeanUtils.populate

1 resposta
danieldestro

Caros,

Estou usando o Apache Commons Bean Utils para popular os atributos de um objeto.

Até agora eu fazia o simples, populava um Map com os valores e usava o populate para popular os valores dos atributos do objeto.

Map<String, Object> dados = new HashMap<String, Object>(); dados.put( "atributoA", "algum valor" ); dados.put( "atributoB", 666 ); MeuObj obj = new MeuObj(); BeanUtils.populate( obj, dados );

Porém agora eu quero popular os atributos de objetos relacionados ao meu objeto. Explico. A classe MeuObj tem um atributo do tipo OutroObj, e quero popular um atributo de OutroObj, relacionado com MeuObj. Exatamente como se faz no Struts, quando você coloca o property “meuObj.outroObj.atributoX”, por trás dos panos ele faz um “meuObj.getOutroObj().setAtributoX(…)”.

Porém , vi que o BeanUtils.populate() não trabalha assim.

Alguém conhece alguma solução pronta?

1 Resposta

danieldestro

Solução adhoc:

private static void setValue( Object obj, Object value, String attribute ) throws Exception {
    obj = getObjectToSetValueToAttribute( obj, name );
    String attribute = getLastPropertyNameOnly(name);
    BeanUtils.setProperty(obj, attribute, value);
  }

  
  private static Object getObjectToSetValueToAttribute(Object obj, String name) {
    if( name.indexOf('.') < 0 ) {
      return obj;
    }
    name = getNestedObjectHierarchyWithoutAttribute(name);
    try {
      obj = PropertyUtils.getNestedProperty(obj, name);
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
    return obj;
  }

  private static String getNestedObjectHierarchyWithoutAttribute( String name ) {
    if( name.indexOf('.') < 0 ) {
      return name;
    }
    return name.substring(0,name.lastIndexOf('.'));
  }

Funcionou aqui, por enquanto.

Criado 12 de novembro de 2007
Ultima resposta 19 de nov. de 2007
Respostas 1
Participantes 1