Salut Philippe,
no worries, everybody has to learn something new about Guice everyday,
I still have a large amount of think to learn but luckily we're here
to help each other, so please don't think your reply was silly, I
appreciate your help!
A bientot!!!
Simo

http://people.apache.org/~simonetripodi/
http://www.99soft.org/



On Fri, Nov 5, 2010 at 9:24 PM, Philippe Beaudoin
<[email protected]> wrote:
> Thanks for the explanation Simone, just learned one more feature of Guice 
> today!
> Also, sorry for my silly reply. :)
>
>  Philippe
>
> On Fri, Nov 5, 2010 at 12:41 PM, Simone Tripodi
> <[email protected]> wrote:
>> @Philippe
>> Guice uses an extensible way to convert Strings to
>> primitives/primitives wrappers/Enums and user defined types. If you
>> want to know more take a look at sisu guice-converter[1] (wrote by
>> Stuart that replied at this mail) or to mine Rocoto converters[2].
>>
>> BTW my sample was just a dummy-silly way to expose the problem, I
>> wrote a piece of code that loads automatically tons of configurations
>> and I don't know which kind of data my team mates will plug :)
>>
>> @Stuart
>> thanks for explanation, very appreciated. So now I have a question for
>> you, being more expert than me, and given the nature of the problem
>> I'm sure you can suggest me a valid suggestion :P
>> In Rocoto I've been maintaining a module[3] that extends the
>> com.google.inject.name.Names behavior and that's able to resolve
>> properties where users can define placeholders, like you do in
>> Ant/Maven, so users can define properties in the form:
>>
>> a = ${b} ${c}
>> b = ${d|e} {f}
>> c = ${g} ${h|i}
>> ...
>>
>> where the pipe |, where present, separates the key name and the
>> default value. Now, the strategy I adopted is letting Guice resolve
>> the variables for me, so
>> I wrote a Provider<String>[4] that parses the properties, but that in
>> some cases forces me binding the properties to the provider... and
>> according the behavior you described, it obviously fails.
>>
>> Do you have any suggestion how to realize a kind of workaround?
>> Many thanks in advance!!!
>> Simo
>>
>> [1] 
>> https://github.com/sonatype/sisu/tree/master/sisu-inject/guice-bean/guice-bean-converters/src/main/java/org/sonatype/guice/bean/converters/
>> [2] 
>> http://code.google.com/p/rocoto/source/browse/#svn/trunk/src/main/java/com/googlecode/rocoto/converters
>> [3] 
>> http://code.google.com/p/rocoto/source/browse/trunk/src/main/java/com/googlecode/rocoto/configuration/ConfigurationModule.java
>> [4] 
>> http://code.google.com/p/rocoto/source/browse/trunk/src/main/java/com/googlecode/rocoto/configuration/resolver/PropertiesResolver.java
>>
>> http://people.apache.org/~simonetripodi/
>> http://www.99soft.org/
>>
>>
>>
>> On Fri, Nov 5, 2010 at 6:25 PM, Stuart McCulloch <[email protected]> wrote:
>>> On 5 November 2010 10:59, Simone Tripodi <[email protected]> wrote:
>>>>
>>>> Hi all guys,
>>>> I'm in trouble with a silly question but I hope you don't mind and
>>>> provide me a little help :P
>>>>
>>>> Given the simple POJO created by Guice:
>>>>
>>>> {{{
>>>> @Singleton
>>>> public class MyConfig {
>>>>
>>>> @Inject @Named("myconfig.autoclose") boolean autoClose(); // please
>>>> note the type
>>>>
>>>> // setter here
>>>>
>>>> }
>>>> }}}
>>>>
>>>> immagine the proeprty come from a text file, if in the module I bind
>>>> the property via:
>>>>
>>>> {{{
>>>>
>>>> binder.bindConstant().annotatedWith(Names.named("myconfig.autoclose")).to(myAlchemyObject.getStringValue());
>>>> }}}
>>>>
>>>> or, like in the com.google.inject.name.Names class:
>>>>
>>>> {{{
>>>> binder.bind(Key.get(String.class,
>>>>
>>>> Names.Named("myconfig.autoclose"))).toInstance(myAlchemyObject.getStringValue());
>>>> }}}
>>>>
>>>> things work well, the String will be successfully (if the value
>>>> matches) to boolean and the startup works well.
>>>>
>>>> Problems come when binding the String to a Provider<String>:
>>>>
>>>> {{{
>>>> binder.bind(Key.get(String.class,
>>>> Names.Named("myconfig.autoclose"))).toProvider(new Provider<String>()
>>>> {
>>>>                        public String get() {
>>>>                            return myAlchemyObject.getStringValue();
>>>>                        }
>>>>                    });
>>>> }}}
>>>>
>>>> the Injector raises an error:
>>>>
>>>> {{{
>>>> 1) No implementation for java.lang.Boolean annotated with
>>>> @com.google.inject.name.Named(value=myconfig.autoclose) was bound.
>>>>  while locating java.lang.Boolean annotated with
>>>> @com.google.inject.name.Named(value=myconfig.autoclose)
>>>>    for field at MyConfig.autoClose(MyConfig.java:XX)
>>>> }}}
>>>>
>>>> Any idea why?
>>>
>>> well looking at the convertConstantStringBinding method, it only considers
>>> String bindings which are constant - ie. those bound using bindConstant or
>>> toInstance - so your Provider binding is never considered for conversion
>>> I think this is a conscious design decision rather than an implementation
>>> detail - iirc this wasn't meant to be a full-featured type conversion system
>>> but something to help with basic configuration (hence constant values)
>>>>
>>>> Any suggestion will be more than appreciated, thanks in advance!
>>>> Simo
>>>>
>>>> http://people.apache.org/~simonetripodi/
>>>> http://www.99soft.org/
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google Groups
>>>> "google-guice" group.
>>>> To post to this group, send email to [email protected].
>>>> To unsubscribe from this group, send email to
>>>> [email protected].
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/google-guice?hl=en.
>>>>
>>>
>>>
>>>
>>> --
>>> Cheers, Stuart
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "google-guice" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected].
>>> For more options, visit this group at
>>> http://groups.google.com/group/google-guice?hl=en.
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "google-guice" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to 
>> [email protected].
>> For more options, visit this group at 
>> http://groups.google.com/group/google-guice?hl=en.
>>
>>
>
> --
> You received this message because you are subscribed to the Google Groups 
> "google-guice" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> For more options, visit this group at 
> http://groups.google.com/group/google-guice?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.

Reply via email to