Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Estou aplicando o princípio de SOLID, mas recebo NullPointerException!

tenho a aplicação que é uma possível solução para o desafio . Segue o Código:

public interface TypeCustomerLoan {
    TypeLoan lending(Integer age, BigDecimal income, String uf);
}

A classe Enum:

@Getter
@Component
public enum TypeLoan {
    PERSONAL(4.0),
    GUARANTEED(3.0),
    CONSIGNMENT(2.0);

    private final double interestRate;
    TypeLoan(double interestRate) {
        this.interestRate = interestRate;
    }
}

As classes que implementa TypeCustomerLoan:

@Component
public class LoanConsignment implements TypeCustomerLoan{
    @Override
    public TypeLoan lending(Integer age, BigDecimal income, String uf) {
        if(income.compareTo(new BigDecimal(5000)) >= 0) {
            return TypeLoan.CONSIGNMENT;
        }
        return null;
    }
}
@Component
public class LoanPersonal implements TypeCustomerLoan{
    @Override
    public TypeLoan lending(Integer age, BigDecimal income, String uf) {
        if(income.compareTo(new BigDecimal(3000)) <= 0) {
            return TypeLoan.PERSONAL;
        }else if((income.compareTo(new BigDecimal(3000)) >= 0 && income.compareTo(new BigDecimal(5000)) <= 0)
                && age < 30 && uf.compareToIgnoreCase("SP") == 0){
            return TypeLoan.PERSONAL;
        }
        return null;
    }
}
@Component
public class LoanGuaranteed implements TypeCustomerLoan{
    @Override
    public TypeLoan lending(Integer age, BigDecimal income, String uf) {
        if(income.compareTo(new BigDecimal(3000)) <= 0) {
            return TypeLoan.GUARANTEED;
        }else if((income.compareTo(new BigDecimal(3000)) >= 0 && income.compareTo(new BigDecimal(5000)) <= 0)
                && age < 30 && uf.compareToIgnoreCase("SP") == 0){
            return TypeLoan.GUARANTEED;
        }
        return null;
    }
}

E o Service:

@Service
public class CustomerService {

    @Autowired
    private List<TypeCustomerLoan> listTypeCustomerLoan;
    public List<TypeLoan> customerLoan(CustomerDTO dto){
        return listTypeCustomerLoan.stream()
                .map(loanType -> loanType.lending(dto.age(), dto.income(), dto.uf()))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

    }
}

Entretanto eu recebo NullPointerException, o por que?

2 respostas
solução!

Eai maninho beleza? Então notei que nessas tuas 3 classes: LoanConsignment , LoanPersonal e LoanGuaranteed. Você faz algumas validações e caso nenhum if seja atendido tu tas retornando null o que é muito provável que este seja o motivo em uma dessas classes a condição não ta sendo atendida eai você toma um nullpointer, experimenta debuggar o código para ver a onde ta quebrando.

Obrigado. Fiquei procurando possíveis erros complexos e esqueci de me atentar que minha Classe Enum TypeLoan estava anotada com @Component, além disso, minha Classe de teste não estava anotada com @SpringBootTest. Enfim, Obrigado por tirar um tempo! e Obrigado pelo toque. s2