Come trovare tutti i Getters che restituiscono Null

1. Panoramica

In questo rapido articolo, utilizzeremo l'API Java 8 Stream e la classe Introspector per richiamare tutti i getter trovati in un POJO.

Creeremo un flusso di getter, ispezioneremo i valori di ritorno e vedremo se un valore di campo è nullo.

2. Configurazione

L'unica configurazione di cui abbiamo bisogno è creare una semplice classe POJO:

public class Customer { private Integer id; private String name; private String emailId; private Long phoneNumber; // standard getters and setters }

3. Invocare metodi Getter

Analizzeremo la classe Customer utilizzando Introspector ; ciò fornisce un modo semplice per scoprire proprietà, eventi e metodi supportati da una classe di destinazione.

Per prima cosa raccoglieremo tutte le istanze di PropertyDescriptor della nostra classe Customer . PropertyDescriptor acquisisce tutte le informazioni di una proprietà Java Bean:

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

Esaminiamo ora tutte le istanze di PropertyDescriptor e richiamiamo il metodo di lettura per ogni proprietà:

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

Il predicato null che usiamo sopra controlla se la proprietà può essere letta richiama il getter e filtra solo i valori null:

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

Infine, creiamo ora un'istanza di un cliente , impostiamo alcune proprietà su null e testiamo la nostra implementazione:

@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. Conclusione

In questo breve tutorial, abbiamo fatto buon uso dell'API Java 8 Stream e di un'istanza Introspector per richiamare tutti i getter e recuperare un elenco di proprietà null .

Come al solito, il codice è disponibile su GitHub.