자격 없음 CDI 없음

13174 단어 javajarkataeecdi

소개



Vamos는 CDI에서 자격을 획득할 수 있으며, CDI에서 CDI로 전환하고 JAVA에서 언어로 확장할 수 있으며, 자격을 부여할 수 있는 능력을 발휘할 수 있습니다.

QUALIFICADORES OU 한정자



상상해보십시오 que temos uma interface com várias implementações, uma das utilidades dos qualifier é informarmos qual implementação vamos usar, se liga no exemplo.

public interface PaymentMethod {
    public void pay();
}


ai temos 2는 PaymentMethod 인터페이스를 통해 구현합니다.

public class CreditCard implements PaymentMethod {
    @Override
    public void pay() {
        System.out.println("payment by cred card");
    }
}



public class Cash implements PaymentMethod {

    @Override
    public void pay() {
        System.out.println("payment by CASH");
    }
}


Se em nossa classe cliente apenas injetarmos a interface PaymentMethod a CDI lançará uma exceção de ambiguidade, informando que não sabe qual implementação irá injetar, calmo até ai ?

public class Checkout {

    @Inject
    private PaymentMethod payment;

    public void checkout() {
        payment.pay();
    }

}


Da uma olha no error que vai aparecer no seu console.

WELD-001475: The following beans match by type, but none have matching qualifiers:
- Managed Bean [class br.com.cassunde.cdi.qualifier.Cash] with qualifiers [@Any @Payment],
- Managed Bean [class br.com.cassunde.cdi.qualifier.CreditCard] with qualifiers [@Any @Payment]


Para resolvermos isso teremos que criar um qualifier CDI, a sua criação e bem simples, basta criar uma anotação java padrão com uma pequena diferença, essa nossa anotação terá um @Qualifier, como o próprio nome já diz, será o responsável por indicar que essa nossa anotação e um 한정자. ficara mais ou menos assim.

@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
@Qualifier
public @interface PaymentCreditCard {}


vamos fazer um exemplo ruim e depois vamos ver uma forma melhor de resolver esse problema usando qualifier, em nosso exemplo a interface PaymentMethod tem 2 implementações a CreditCard e a Cash, em nossa abordagem ruim faremos uma outra anotação para qualificarmos a segunda implementação então vamos lá: Qualifier para Implementação 현금:

@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
@Qualifier
public @interface PaymentCash {}


para usarmos esses qualifier ficara mais ou menos assim: - 신용카드 구현

@PaymentCreditCard
public class CreditCard implements PaymentMethod {

    @Override
    public void pay() {
        System.out.println("payment by creditcard");
    }
}


클래스 클라이언트

public class Checkout {

    @Inject
    @PaymentCreditCard
    private PaymentMethod payment;

    public void checkout() {
        System.out.println("Starting checkout");
        payment.pay();
    }
}


Dessa forma não fica muito legal, caso apareça uma nova implementação teremos que criar uma nova anotação e por ai vai... vamos agora melhorar essa abordagem, vamos inserir uma enum em nosso 한정자.

Vou criar essa enum e um terceiro 한정자 chamado

public enum PaymentType {
    CREDIT,
    CASH,
    DEBIT
}


Nosso terceiro 한정자 ficaria assim:

@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
@Qualifier
public @interface Payment {
    PaymentType type();
}


Agora podemos substituir os primeiros qualifier que criamos por esse último, ficando mais ou menos assim:

신용카드 구현

@Payment(type=PaymentType.CREDIT)
public class CreditCard implements PaymentMethod {

    @Override
    public void pay() {
        System.out.println("payment by cred card");
    }
}


방법 클라이언트

public class Checkout { 

    @Inject
    @Payment(type=PaymentType.CREDIT)
    private PaymentMethod payment; 

    public void checkout() {
        System.out.println("Starting checkout");
        payment.pay();
    }
}


현금 구현

@Payment(type=PaymentType.CASH)
public class Cash implements PaymentMethod {

    @Override
    public void pay() {
        System.out.println("payment by cred card");
    }
}


방법 클라이언트

public class Checkout { 

    @Inject
    @Payment(type=PaymentType.CASH)
    private PaymentMethod payment; 

    public void checkout() {
        System.out.println("Starting checkout");
        payment.pay();
    }
}


Observem que agora estamos usando apenas uma única anotação e estamos "tipando"nosso 한정자, dessa forma temos mais liberdade para evoluir o código.

모든 것이 마찬가지입니다.

좋은 웹페이지 즐겨찾기