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.