[bv-dev] BVAL-238 Dependency injection in ConstraintViolation

Emmanuel Bernard emmanuel at hibernate.org
Thu Jan 5 07:42:39 EST 2012


On 4 janv. 2012, at 23:38, Gunnar Morling wrote:

>> I was expecting to retrieve only dependent objects from InstanceProvider:>> - ConstraintValidator are dependent objects (at least unless we go for your alternative approach - which I'm a bit reluctant of today)> - MessageREsolver and TraversableResolver can easily be dependent objects and rely on injected objects from other scopes>> Do you see this as a problem? The alternative would be to alter the contract to pass a flag when we mandate a dependent object.
> I'm not sure. MessageResolver implementations for instance might well
> be stateless and hence long living (singleton) beans. Of course we
> might just specify that only dependent objects might be returned by
> InstanceProvider. I'm just a little bit concerned about creating lot's
> of beans which were actually not required. I think if we allow non
> dependent objects we must require BV providers to not keep references
> to them longer then necessary.
> 
> How would the flag look like you're mentioning?

T getInstance(Class<T> type, Scope scope);

enum Scope {
    DEPENDENT,
    AUTO
}

But I'm not a big fan of this approach.

>>> This would only happen via the XML configuration, right? In that case
>>> the InstanceProvider would create the beans and perform the injection
>>> (via CDI in case of the CDIInstanceProvider).
>> 
>> No. I don't want to give XML a special privilege. So I am entertaining the idea of have a programmatic way to pass such a class. What do you think?
>> Arguing against myself, if someone wants to programmatically build a ValidatorFactory in a DI environment, he will likely get the MessageResolver and TraversalResolver from the DI by injection in his provider and do the wiring there?
> 
> But using a programmatic API, would one pass classes for interpolator
> et al. or instances? I'd expect the latter. In that case XML still
> would be the only scenario where classes (or class names) are
> specified, requiring BV to instantiate the beans.

If we allow classes to be provided programmatically, it would be

interface Configuration<T extends Configuration<T>> {
    T messageResolver(MessageResolver resolver);
    T messageResolverClass(Class<? extends MessageResolver> resolverClass);
}

The advantage is that we handle the object instantiation inhouse instead of leaving that to the caller. The inconvenient is that we handle the object instantiation inhouse :)




More information about the beanvalidation-dev mailing list