[ 
https://jira.jboss.org/browse/WELD-555?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Pete Muir closed WELD-555.
--------------------------

      Assignee: Pete Muir
    Resolution: Rejected


> Pluggable validation
> --------------------
>
>                 Key: WELD-555
>                 URL: https://jira.jboss.org/browse/WELD-555
>             Project: Weld
>          Issue Type: Feature Request
>          Components: Weld SPI
>            Reporter: Kabir Khan
>            Assignee: Pete Muir
>
> From Weld Dev mailing list:
> --------------------------------------------
> 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
>   

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        
_______________________________________________
weld-issues mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/weld-issues

Reply via email to