That's tricky. I'm sort of having the same problem with Spring integration.
Bean Validation requires a matching bean to exist so the only idea I can
come up with is to register a placeholder before injection actually
takes place. But that defeats the purpose of having an InjectionService
(what's the use for it if you can do the same via a custom bean).
One potential solution that I see is to allow for a ValidationService in
a similar vein to InjectionService.
On 10-06-11 11:18 AM, Kabir Khan wrote:
> The Weld/MC integration currently works via a "push" model where the MC
> pushes beans with the @WeldEnabled annotation so that they are usable from
> Weld. If I have this MC bean
>
> @Thing
> @WeldEnabled
> public class ThingBean
> {
> }
>
> and this Weld bean
> public class ThingField
> {
> @Inject @Thing
> public ThingBean thing;
> }
>
> Then when deployed the MC bean is made available to Weld. I do something
> along the lines of
>
> ---
> //Set up Weld
> TestContainer testContainer = new TestContainer(new MockEELifecycle(),
> Arrays.asList(McBeanObserver.class, ThingBean.class), null);
>
> testContainer.getDeployment().getServices().add(InjectionServices.class, new
> McLookupInjectionServices()); //Adding custom injection services
> testContainer.getLifecycle().initialize();
>
> //Deploy MC bean
> ...
>
> //Start up Weld
> testContainer.getLifecycle().beginApplication(); //A
> testContainer.ensureRequestActive();
>
> //Get bean
> Set<Bean<?>> beans = getCurrentManager().getBeans(clazz);
> assertEquals(1, beans.size());
> Bean<ThingBean> bean = (Bean<ThingBean>)beans.iterator().next();
> CreationalContext<T> createCtx =
> getCurrentManager().createCreationalContext(null);
>
> ThingBean bean = bean.create(createCtx); //B
> ---
> This works fine. My McLookupInjectionServices bean just does some simple
> logging while playing around
>
> public class McLookupInjectionServices implements InjectionServices
> {
>
> public<T> void aroundInject(InjectionContext<T> ctx)
> {
> System.out.println("--------> CUSTOM INJECTION SERVICES");
> ctx.proceed();
> }
>
> public void cleanup()
> {
> }
> }
> and I can see it kicking in as a result of the call to B.
>
> What I would like to do is to change what I have done so that instead of
> having to know in advance which MC beans should be made available to Weld, to
> use my McLookupInjectionServices to "pull" any beans it can not find in Weld
> from the Microcontainer instead. My initial attempt at this is to get rid of
> the @WeldEnabled annotation from the MC bean:
>
> @Thing
> @WeldEnabled
> public class ThingBean
> {
> }
>
> However, this falls at A, and never gets to my McLookupInjectionServices
> org.jboss.weld.DeploymentException: Injection point has unstatisfied
> dependencies. Injection point: field
> org.jboss.test.kernel.weld.mctowb.support.wb.ThingField.thing; Qualifiers:
> [[email protected]()]
> at org.jboss.weld.Validator.validateInjectionPoint(Validator.java:232)
> at org.jboss.weld.Validator.validateBean(Validator.java:80)
> at org.jboss.weld.Validator.validateRIBean(Validator.java:100)
> at org.jboss.weld.Validator.validateBeans(Validator.java:282)
> at org.jboss.weld.Validator.validateDeployment(Validator.java:268)
> at
> org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:389)
> at
> org.jboss.weld.mock.MockServletLifecycle.beginApplication(MockServletLifecycle.java:105)
>
> This ends up in TypeSafeResolver
> public Set<T> resolve(Resolvable key)
> {
> final MatchingResolvable resolvable =
> MatchingResolvable.of(transform(key));
>
> Callable<Set<T>> callable = new Callable<Set<T>>()
> {
> public Set<T> call() throws Exception
> {
> return sortResult(filterResult(findMatching(resolvable)));
> }
>
> };
> Set<T> beans = resolved.putIfAbsent(resolvable, callable);
> return Collections.unmodifiableSet(beans);
> }
>
> but I don't see any way to make this pluggable so that it can check the MC?
> Is there such functionality, and if not would it be possible to add it? The
> idea being that I could do
>
> public<T> void aroundInject(InjectionContext<T> ctx)
> {
> System.out.println("--------> CUSTOM INJECTION SERVICES");
> ctx.proceed();
>
> //Iterate over ctx.getInjectionTarget().getInjectionPoints() and find
> the unresolved ones
> }
>
> Although, I don't know if there is anything there to see if an injection
> point has been injected either?
>
> Cheers,
>
> Kabir
> _______________________________________________
> weld-dev mailing list
> [email protected]
> https://lists.jboss.org/mailman/listinfo/weld-dev
>
_______________________________________________
weld-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/weld-dev