2
respostas

Verificar se o valor de uma classe a nulo utilizando anotação.

Boa tarde,

Criei a anotação abaixo:

@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface EventoFieldMandatory { }

e tenho duas classe

@Data public class TesteDTO extends CreateUpdateDTO { private Boolean isExibirCampos; }

E uma super calsse

@Data public class CreateUpdateDTO { @EventoFieldMandatory() private LocalTime hora; @EventoFieldMandatory() private @NotNull LocalDate data; }

Caso a flag isExibirCampos seja true eu preciso verificar se os campos hora e data são nulos. Com isso criei esse metodo para receber a flag isExibirCampos e verificar a anotação:

public class Validate {

public static void main(String[] args) throws ValidationException { TesteDTO dto = new TesteDTO(); dto.setExibirCamposAgenda(true);

ValidateEvento.valideteMandatoryFilds(dto.isExibirCampos(), dto.getClass());

}

public static void valideteMandatoryFilds(Boolean isMandatory, Class<?> objeto) throws ValidationException { if (isMandatory) { List fields = getFields(objeto);

  for (Field field : fields) {
    if (field.isAnnotationPresent(EventoFieldMandatory.class)) {
      String nomeCampo = field.getName();
      try {
        field.setAccessible(true);
        Object valorCampo = field.get(objeto);
        if (valorCampo == null) {
          throw new ValidationException("O campo " + nomeCampo + " não deve ser nulo.");
        }
      } catch (IllegalAccessException e) {
        throw new RuntimeException("Erro ao acessar o campo " + nomeCampo, e);
      }
    }
  }
}

} @NotNull private static List getFields(Class<?> objeto) { List campos = new ArrayList<>(); campos.addAll(Arrays.asList(objeto.getDeclaredFields()));

Class<'?'> superClasse = objeto.getSuperclass();
if (Objects.nonNull(superClasse)) {
  campos.addAll(Arrays.asList(superClasse.getDeclaredFields()));
}
return campos;

}

Porem não consigo recuperar o valor do atribudo field.get(objeto); ele me lanca a exception Method threw 'java.lang.IllegalArgumentException' exception.

Já tentei fazer field.get(objeto.getSuperclass()) Como a varievel que preciso recuperar está na superClasse Porem tenho o mesmo erro.

Alguem teria alguma ideia da onde estou errando?

2 respostas

E aí!

Então, o problema tá no trecho onde você tá tentando pegar o valor do campo da superclasse. Quando você usa field.get(objeto), o objeto é uma instância de TesteDTO, que é a subclasse. Mas os campos anotados com @EventoFieldMandatory estão na superclasse CreateUpdateDTO.

O que você pode fazer é primeiro ver se o campo está presente na superclasse e, se estiver, pegar o valor dessa instância da superclasse. Dá uma olhada no ajuste que fiz no código:

public static void validateMandatoryFields(Boolean isMandatory, Class<?> objectClass) throws ValidationException {
    if (isMandatory) {
        List<Field> fields = getFields(objectClass);

        for (Field field : fields) {
            if (field.isAnnotationPresent(EventoFieldMandatory.class)) {
                String fieldName = field.getName();
                try {
                    field.setAccessible(true);

                    // Verifica se o campo está na superclasse
                    if (field.getDeclaringClass() != objectClass) {
                        field = objectClass.getDeclaredField(fieldName);
                        field.setAccessible(true);
                    }

                    Object fieldValue = field.get(objectClass.newInstance());
                    if (fieldValue == null) {
                        throw new ValidationException("O campo " + fieldName + " não deve ser nulo.");
                    }
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("Erro ao acessar o campo " + fieldName, e);
                } catch (InstantiationException | NoSuchFieldException e) {
                    throw new RuntimeException("Erro ao criar instância da classe ou obter o campo " + fieldName, e);
                }
            }
        }
    }
}

Além disso, fiz algumas melhorias no código para lidar com exceções relacionadas à instância da classe e à obtenção do campo. Dá uma testada e veja se resolve!

Opa,

Ha bacana muito obrigado.