Я попытался реализовать решение другого вопроса: 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.
Итак, что я делаю неправильно? : -/