2
respostas

Aplicar strategy em objetos gerenciados pelo Spring

Em um projeto Spring, seria viável a aplicação desse padrão strategy? Pergunto isso, pois há erro de ambiguidade quando a interface é implementada por 2 ou mais classes.

2 respostas

Oi Erivelton,

É possível sim no Spring, sendo que se apenas uma implementação da interface deve ser injetada, então você precisa usar o conceito de Qualifier Bean: https://www.baeldung.com/spring-qualifier-annotation

Também daria para injetar todas as implementações em uma lista:

@Autowired
private List<Imposto> impostos;

Bons estudos!

switch(tipoImposto) {
case ICMS:
    return orcamento.getValor().multiply(new BigDecimal("0.1"));
case ISS:
    return orcamento.getValor().multiply(new BigDecimal("0.06"));
default:
    return BigDecimal.ZERO
}

Fazendo um paralelo do Spring e com código acima que foram transformadas em implementações e supondo que fosse if, else if e else, teria alguma forma de definir explicitamente a implementação de acordo com o parâmetro vindo da requisição, como por exemplo: { "imposto": "ISS" }

Ou não sei se seria uma boa forma de implementar endpoints específicos para cada imposto e no controller definir o @Qualifier para a implementação específica da chamada do endpoint: GET .../orcamento/ICMS

@Component("icms")
public class ICMS implements TipoImposto{

    public BigDecimal calcular(Orcamento orcamento) {
        return orcamento.getValor().multiply(new BigDecimal("0.1"));
    }
}
@RestController
@RequestMapping("/orcamento/ICMS")
public class OrcamentoComICMSController{

    @Qualifier("icms")
    private TipoImposto tipoImposto;
}

GET .../orcamento/ISS

@Component("iss")
public class ISS implements TipoImposto{

    public BigDecimal calcular(Orcamento orcamento) {
        return orcamento.getValor().multiply(new BigDecimal("0.06"));
    }
}
@RestController
@RequestMapping("/orcamento/ISS")
public class OrcamentoComISSController{

    @Qualifier("iss")
    private TipoImposto tipoImposto;
}