2015-12-11 4 views
2

Я попытался реализовать решение другого вопроса: https://stackoverflow.com/a/10059245/1943765, но он не работает во всех случаях.Исключение сварки, когда определено значение аннотации производителя

Когда я ставлю этот код в КДИ боба (код фасоли показан на нижней части):

@Inject @HttpParam 
private String code; 

все работает отлично. Но когда я пытаюсь определить значение для @HttpParam аннотации (так, не по умолчанию один) Weld не можешь запустить:

@Inject @HttpParam(value="code") 
private String token; 

Я получаю это исключение:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type String with qualifiers @HttpParam 
    at injection point [BackedAnnotatedField] @Inject @HttpParam private org.test.site.jsf.beans.request.ActivationBean.token 
    at org.test.site.jsf.beans.request.ActivationBean.token(ActivationBean.java:0) 
WELD-001475: The following beans match by type, but none have matching qualifiers: 
    - Producer Method [String] with qualifiers [@HttpParam @Any] declared as [[BackedAnnotatedMethod] @Produces @HttpParam public org.test.site.cdi.producer.HttpParamProducer.getHttpParameter(InjectionPoint)] 
at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281) 
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:155) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:518) 
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68) 
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) 
    ... 4 more 

кода я похож на связанный вопрос SO.

Обычай @HttpParam аннотация:

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER}) 
public @interface HttpParam { 
    public String value() default ""; 
} 

Производитель значение аннотаций:

public class HttpParamProducer { 

    @Inject 
    FacesContext facesContext; 

    @Produces 
    @HttpParam 
    String getHttpParameter(InjectionPoint ip) { 
     String name = ip.getAnnotated().getAnnotation(HttpParam.class).value(); 
     if ("".equals(name)) name = ip.getMember().getName(); 
     return facesContext.getExternalContext() 
       .getRequestParameterMap() 
       .get(name); 
    } 
} 

И КДИ боб использовать его что-то вроде:

@Named("activation") 
@RequestScoped 
public class ActivationBean implements Serializable{ 

    @Inject 
    @HttpParam(value="code") 
    private String token; 

    // rest of valid class code 
} 

Также я использую Tomcat 8 с Weld Servlet 2.3.1.Final.

Итак, что я делаю неправильно? : -/

ответ

3

Вам необходимо добавить @Nonbinding в ваш атрибут value, чтобы его значение не обязательно выбирало, какой метод-производитель нужно вызвать, но позволяет одному производителю фабричного стиля проверять вашу точку впрыска.

Вы также можете просмотреть what is the purpose of @Nonbinding annotation in a Qualifier supposed to be in Java EE7?

3

По умолчанию атрибутов в КДИ Qualifier также используется для определения того, какой боб для инъекций.

Поскольку вы вводите @HttpParam(value="code"), но ваш производитель производит @HttpParam(value=""). Они не совпадают, и CDI не знает, что делать.

Чтобы КДИ игнорировать атрибуты в КДИ Qualifier при определении того, какой боб, который будет введен, вы можете пометить @Nonbinding этих атрибутов

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER}) 
public @interface HttpParam { 
    @Nonbinding 
    public String value() default ""; 
} 
Смежные вопросы