Search code examples
javadtois-empty

How to check if a DTO is empty


I have a DTO with a few variables and I need to check if my DTO is empty.

I looked into older questions and found this one which is quite interesting Check object empty

But I have the feeling that my solution can be improved as it´s something quite raw.

Here is my code.

 public boolean isEmpty() {
            return StringUtils.isBlank(nombre) && StringUtils.isBlank(apellidos1) && StringUtils.isBlank(apellidos2) && StringUtils.isBlank(NIF) 
                    && StringUtils.isBlank(nFederado) && StringUtils.isBlank(fecha) && StringUtils.isBlank(poliza) && StringUtils.isBlank(estado) 
                    && StringUtils.isBlank(numeroLesion);
    }

I use this function in the action of an API to check if it´s completely empty. here is my action:

 @Override
    public Map execute(Map params) throws Exception {
        log.error(" En el action consultar federados action (en el punto que queremos)  ");
        ConsultarFederado consultaFederado = new ConsultarFederado();
        Map result = new HashMap<>();
        Map requestParams = (Map) params.get("request_params");
            consultaFederado.setNombre(setValue("nombre", requestParams));
            consultaFederado.setApellidos1(setValue("apellidos1", requestParams));
            consultaFederado.setApellidos2(setValue("apellidos2", requestParams));
            consultaFederado.setNIF(setValue("nif", requestParams));
            consultaFederado.setFecha(setValue("fecha", requestParams));
            consultaFederado.setPoliza(setValue("poliza", requestParams));
            consultaFederado.setnFederado(setValue("nFederado", requestParams));
            consultaFederado.setEstado(setValue("estado", requestParams));
            consultaFederado.setNumeroLesion(setValue("numLesion", requestParams));
            if (consultaFederado.isEmpty()) {
                ConsultarFederadoDAO.consultaFederado(consultaFederado);
            }
            result.put("code", "997");
            result.put("message", "Es necesario introducir parametros en la consulta");
            log.error(" El resultado de la consulta es : " + result.toString());
        return result;
    }

Any thoughs on how i could improve this isEmpty() method?

The DTO is an object with 9 Strings.

EDIT: isEmpty function improved based on Stephen comment

EDIT2:

The final action:

public Map execute(Map params) throws Exception {
        log.error(" *********************** Consultar Federados Action INI ********************** ");
        ConsultarFederado consultaFederado = new ConsultarFederado();
        Map result = new HashMap<>();
        Map requestParams = (Map) params.get("request_params");
            log.info("setValue(nombre, requestParams)" + getValueValidated("nombre", requestParams));
            consultaFederado.setNombre(getValueValidated("nombre", requestParams));
            consultaFederado.setApellidos1(getValueValidated("apellidos1", requestParams));
            consultaFederado.setApellidos2(getValueValidated("apellidos2", requestParams));
            consultaFederado.setNIF(getValueValidated("nif", requestParams));
            consultaFederado.setFecha(getValueValidated("fecha", requestParams));
            consultaFederado.setPoliza(getValueValidated("poliza", requestParams));
            consultaFederado.setEstado(getValueValidated("estado", requestParams));
            consultaFederado.setNumeroLesion(getValueValidated("numLesion", requestParams));
             if (!consultaFederado.isEmpty()) {
                result = ConsultarFederadoDAO.consultaFederado(consultaFederado);
             } else {
                 XWMException err = new XWMException();
                 err.addError("996", "Es necesario introducir parametros en la consulta");
                 throw err;
             }
            log.error("**************** RESULT_SEND : " + result.toString());
            return result;
    }

private String getValueValidated(String value, Map requestParams) {
    return Objects.toString(requestParams.get(value), "");
    }

And the object isEmpty() method:

    public boolean isEmpty() {
     return StringUtils.isBlank(nombre) && StringUtils.isBlank(apellidos1) && StringUtils.isBlank(apellidos2) && StringUtils.isBlank(NIF) 
            && StringUtils.isBlank(fecha) && StringUtils.isBlank(poliza) && StringUtils.isBlank(estado) 
            && StringUtils.isBlank(numeroLesion);
}

public boolean isEmptyGeneral() {
    return StringUtils.isBlank(nombre) && StringUtils.isBlank(apellidos1) && StringUtils.isBlank(apellidos2) && StringUtils.isBlank(NIF) 
           && StringUtils.isBlank(fecha) && StringUtils.isBlank(numeroLesion);

}

public boolean isEmptyEstado() {
    return StringUtils.isBlank(nombre) && StringUtils.isBlank(apellidos1) && StringUtils.isBlank(apellidos2) && StringUtils.isBlank(NIF) 
           && StringUtils.isBlank(fecha) && StringUtils.isBlank(numeroLesion);
}

public boolean isEmptyNombre() {
    return StringUtils.isBlank(apellidos1) && StringUtils.isBlank(apellidos2) && StringUtils.isBlank(NIF) && StringUtils.isBlank(poliza) 
           && StringUtils.isBlank(fecha) && StringUtils.isBlank(numeroLesion);

}

Finally i created 4 "isEmpty" methods to check a few special combinations inside my code.

Here is my logic:

   public static Map consultaFederado(ConsultarFederado dto) throws XWMException, Exception    {
    if (StringUtils.isNotBlank(dto.getPoliza()) && dto.isEmptyGeneral()) {
         throwParamsError();
    } 
    if (StringUtils.isNotBlank(dto.getEstado()) && dto.isEmptyEstado()) {
       throwParamsError();
    } 
    if (StringUtils.isNotBlank(dto.getNombre()) && dto.isEmptyNombre()){ 
        throwParamsError();
    }
    
    Map result = buscarFederados(dto);
    return result;
}

Thank you eveyone for the feedback, without you this code would be quite worse


Solution

  • If you want a nicer look one, how about a lombok @NonNull check, and adding string empty check for all field in a private constructor.

    import lombok.Builder;
    import lombok.Data;
    import lombok.NonNull;
    import org.apache.commons.lang3.StringUtils;
    
    
    @Data
    @Builder
    public class TestDTO {
        @NonNull
        private String first;
        @NonNull
        private String second;
        @NonNull
        private String third;
    
        public static void main(String[] args) {
    //        TestDTO dto = TestDTO.builder().first("fdasf").build(); //Exception in thread "main" java.lang.IllegalArgumentException: second can't be blank/empty/null
            TestDTO dto = TestDTO.builder().first("fdasf").second("fdasf").third("fdasfdsa").build();
            System.out.println("dto = " + dto);
        }
    
        private TestDTO(final String first, final String second, final String third) {
            if (StringUtils.isBlank(first)) {
                throw new IllegalArgumentException("First can't be blank/empty/null");
            }
            if (StringUtils.isBlank(second)) {
                throw new IllegalArgumentException("second can't be blank/empty/null");
            }
            if (StringUtils.isBlank(third)) {
                throw new IllegalArgumentException("third can't be blank/empty/null");
            }
    
            this.first = first;
            this.second = second;
            this.third = third;
        }
    }