Como encontrar todos os getters retornando nulos

Como encontrar todos os getters retornando nulos

1. Visão geral

Neste artigo rápido, usaremos a API Java 8 Stream e a classeIntrospector - para invocar todos os getters encontrados em um POJO.

Vamos criar um fluxo de getters, inspecionar os valores de retorno e ver se o valor de um campo énull.

2. Configuração

A única configuração que precisamos é criar uma classe POJO simples:

public class Customer {

    private Integer id;
    private String name;
    private String emailId;
    private Long phoneNumber;

    // standard getters and setters
}

3. Invocando Métodos Getter

Vamos analisar a classeCustomer usandoIntrospector; isso fornece uma maneira fácil de descobrir propriedades, eventos e métodos suportados por uma classe de destino.

Primeiro, coletaremos todas as instânciasPropertyDescriptor de nossa classeCustomer. PropertyDescriptor captura todas as informações de uma propriedade Java Bean:

PropertyDescriptor[] propDescArr = Introspector
  .getBeanInfo(Customer.class, Object.class)
  .getPropertyDescriptors();

Vamos agora examinar todas as instâncias dePropertyDescriptor e invocar o método read para cada propriedade:

return Arrays.stream(propDescArr)
  .filter(nulls(customer))
  .map(PropertyDescriptor::getName)
  .collect(Collectors.toList());

O predicadonulls que usamos acima verifica se a propriedade pode ser lida invoca o getter e filtra apenas valores nulos:

private static Predicate nulls(Customer customer) {
    return = pd -> {
        Method getterMethod = pd.getReadMethod();
        boolean result = false;
        return (getterMethod != null && getterMethod.invoke(customer) == null);
    };
}

Finalmente, vamos agora criar uma instância de aCustomer, definir algumas propriedades como nulas e testar nossa implementação:

@Test
public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() {
    Customer customer = new Customer(1, "John", null, null);

    List result = Utils.getNullPropertiesList(customer);
    List expectedFieldNames = Arrays
      .asList("emailId","phoneNumber");

    assertTrue(result.size() == expectedFieldNames.size());
    assertTrue(result.containsAll(expectedFieldNames));
}

4. Conclusão

Neste breve tutorial, fizemos bom uso da API Java 8 Stream e uma instânciaIntrospector - para invocar todos os getters e recuperar uma lista de propriedades nulas.

Como de costume, o código está disponívelover on GitHub.