binding date using properties

163 views
Skip to first unread message

egolan

unread,
Jan 31, 2012, 9:42:19 AM1/31/12
to google-guice
Hi,
I am using Names.bindProperties(binder(), properties); where my
properties are taken from a pre-initialized configuration.
One of the properties represent java.util.Date.
We have a simple date format class that sets the value:
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy
HH:mm:ss");
when I just use the Names binding, I get the Guice creation exception
that the named field was not bound.
This is my injected constructor:

@Inject
public CoreFetchOperationsImpl(@Named("MpsQueryFilter") String
genericQuery, @Named("MpsIterationBulkSize")int bulkSizeFetch,
@Named("MpsLastProcessingTime") Date lastProcessingTime)

In order to solve it, I am getting from the pre-initialized
configuration the concrete Date as string, parse it using the format
and bind specifically:
bind(Date.class).annotatedWith(Names.named("MpsLastProcessingTime")).toInstance(parsedDate));

Is there a better way?

Thanks

Stuart McCulloch

unread,
Jan 31, 2012, 10:10:16 AM1/31/12
to google...@googlegroups.com
On 31 Jan 2012, at 14:42, egolan wrote:

> Hi,
> I am using Names.bindProperties(binder(), properties); where my
> properties are taken from a pre-initialized configuration.
> One of the properties represent java.util.Date.
> We have a simple date format class that sets the value:
> SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy
> HH:mm:ss");
> when I just use the Names binding, I get the Guice creation exception
> that the named field was not bound.

Names.bindProperties(...) creates constant bindings for the properties map - constant bindings are converted from Strings to actual instances by TypeConverters:

http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/TypeConverter.html

Guice provides built-in TypeConverters for primitive types, enums, and class literals - but not for Date, hence the creation exception. However, you can add your own:

http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binder.html#convertToTypes(com.google.inject.matcher.Matcher%3C?%20super%20com.google.inject.TypeLiteral%3C?%3E%3E,%20com.google.inject.spi.TypeConverter)

See also http://99soft.github.com/rocoto/ which provides a range of useful TypeConverters, including one for Date: http://99soft.github.com/rocoto/converters.html

> This is my injected constructor:
>
> @Inject
> public CoreFetchOperationsImpl(@Named("MpsQueryFilter") String
> genericQuery, @Named("MpsIterationBulkSize")int bulkSizeFetch,
> @Named("MpsLastProcessingTime") Date lastProcessingTime)
>
> In order to solve it, I am getting from the pre-initialized
> configuration the concrete Date as string, parse it using the format
> and bind specifically:
> bind(Date.class).annotatedWith(Names.named("MpsLastProcessingTime")).toInstance(parsedDate));
>
> Is there a better way?
>
> Thanks
>

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

Tim Peierls

unread,
Jan 31, 2012, 10:55:38 AM1/31/12
to google...@googlegroups.com
I recommend using Rocoto, too, but here's an example that shows how to do it yourself, expressed as a JUnit test:


--tim

Eyal Golan

unread,
Jan 31, 2012, 11:20:54 AM1/31/12
to google...@googlegroups.com
Thanks for the inputs.
The code example is what I needed.
However, using it will convert all Date classes that get injected.
Is there a way to create a converter only for parameters annotated with Named ?


Eyal Golan
egol...@gmail.com

Visit: http://jvdrums.sourceforge.net/
LinkedIn: http://www.linkedin.com/in/egolan74
Skype: egolan74

P  Save a tree. Please don't print this e-mail unless it's really necessary

jordi

unread,
Jan 31, 2012, 11:39:08 AM1/31/12
to google...@googlegroups.com
use a regular guice Matcher [1], I guess this would do the trick:

import static com.google.inject.matcher.Matchers.annotatedWith;

// ...
protected void configure() {
  convertToTypes(annotatedWith(Names.named("YOUR_KEY")), typeConverter);
}

jordi

egolan

unread,
Jan 31, 2012, 11:41:18 AM1/31/12
to google-guice
jordi,
I tried that. the convertToTypes needs TypeLiteral.

Tim & Stuart,
This is great !!
I think it is a good idea to inject all dates with that converter.
However, just to understand. Is it possible to convert base on
Annotation (or Named)

Thanks,

On Jan 31, 6:39 pm, jordi <jo...@donky.org> wrote:
> use a regular guice Matcher [1], I guess this would do the trick:
>
> import static com.google.inject.matcher.Matchers.annotatedWith;
>
> // ...
> protected void configure() {
>   convertToTypes(annotatedWith(Names.named("YOUR_KEY")), typeConverter);
>
> }
>
> jordi
>
> [1]http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/injec...
>
>
>
>
>
>
>
> On Tue, Jan 31, 2012 at 5:20 PM, Eyal Golan <egola...@gmail.com> wrote:
> > Thanks for the inputs.
> > The code example is what I needed.
> > However, using it will convert all Date classes that get injected.
> > Is there a way to create a converter only for parameters annotated with
> > Named ?
>
> > Eyal Golan
> > egola...@gmail.com
>
> > Visit:http://jvdrums.sourceforge.net/
> > LinkedIn:http://www.linkedin.com/in/egolan74
> > Skype: egolan74
>
> > P  Save a tree. Please don't print this e-mail unless it's really necessary
>
> > On Tue, Jan 31, 2012 at 5:55 PM, Tim Peierls <t...@peierls.net> wrote:
>
> >> I recommend using Rocoto, too, but here's an example that shows how to do
> >> it yourself, expressed as a JUnit test:
>
> >>http://pastebin.com/mWx9xG4M
>
> >> --tim
>
> >> On Tue, Jan 31, 2012 at 10:10 AM, Stuart McCulloch <mccu...@gmail.com>wrote:
>
> >>> On 31 Jan 2012, at 14:42, egolan wrote:
>
> >>> > Hi,
> >>> > I am using  Names.bindProperties(binder(), properties); where my
> >>> > properties are taken from a pre-initialized configuration.
> >>> > One of the properties represent java.util.Date.
> >>> > We have a simple date format class that sets the value:
> >>> > SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy
> >>> > HH:mm:ss");
> >>> > when I just use the Names binding, I get the Guice creation exception
> >>> > that the named field was not bound.
>
> >>> Names.bindProperties(...) creates constant bindings for the properties
> >>> map - constant bindings are converted from Strings to actual instances by
> >>> TypeConverters:
>
> >>>http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/injec...
>
> >>> Guice provides built-in TypeConverters for primitive types, enums, and
> >>> class literals - but not for Date, hence the creation exception. However,
> >>> you can add your own:
>
> >>>http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/injec...)
>
> >>> See alsohttp://99soft.github.com/rocoto/which provides a range of

Stuart McCulloch

unread,
Jan 31, 2012, 12:13:06 PM1/31/12
to google...@googlegroups.com
On 31 Jan 2012, at 16:41, egolan wrote:
> jordi,
> I tried that. the convertToTypes needs TypeLiteral.
>
> Tim & Stuart,
> This is great !!
> I think it is a good idea to inject all dates with that converter.
> However, just to understand. Is it possible to convert base on
> Annotation (or Named)

That's right - Type conversion only matches by TypeLiteral (not by Key) so it's not possible to select different TypeConverters for different annotations.

What's your use-case for selecting different String->Date conversions by annotation? There are several approaches you could take involving the SPI, etc. but a lot depends on your use-case...

Eyal Golan

unread,
Jan 31, 2012, 12:21:38 PM1/31/12
to google...@googlegroups.com
I'm not sure exactly yet what are ALL of my use cases :)

This is what I have right now:
property named LastProcessingTime , which has a specific representation of Date (base on a format we have been using).
A class (the service) that needs to use this property as Date, and that property is injected by @Named

I will also need to update DB with date (different one) with the same format, but this will be using a method call.

In the future (we are migrating to Guice just now), I will have other services that will get injected with date, but they'll have different @Named.

Well,
After explaining, I think that conversion will be good for the future use-cases as well :)

Thanks for the help !!
The code is much cleaner now.




Visit: http://jvdrums.sourceforge.net/
LinkedIn: http://www.linkedin.com/in/egolan74
Skype: egolan74

P  Save a tree. Please don't print this e-mail unless it's really necessary

igor.petrouk

unread,
Jan 31, 2012, 11:25:31 AM1/31/12
to google-guice
It is used for all String params that are injected to Date variables
and need conversion. This looks like what you need.

On 31 Січ, 18:20, Eyal Golan <egola...@gmail.com> wrote:
> Thanks for the inputs.
> The code example is what I needed.
> However, using it will convert all Date classes that get injected.
> Is there a way to create a converter only for parameters annotated with
> Named ?
>
> Eyal Golan
> egola...@gmail.com
>
> Visit:http://jvdrums.sourceforge.net/
> LinkedIn:http://www.linkedin.com/in/egolan74
> Skype: egolan74
>
> P  Save a tree. Please don't print this e-mail unless it's really necessary
>
>
>
>
>
>
>
> On Tue, Jan 31, 2012 at 5:55 PM, Tim Peierls <t...@peierls.net> wrote:
> > I recommend using Rocoto, too, but here's an example that shows how to do
> > it yourself, expressed as a JUnit test:
>
> >http://pastebin.com/mWx9xG4M
>
> > --tim
>
> > On Tue, Jan 31, 2012 at 10:10 AM, Stuart McCulloch <mccu...@gmail.com>wrote:
>
> >> On 31 Jan 2012, at 14:42, egolan wrote:
>
> >> > Hi,
> >> > I am using  Names.bindProperties(binder(), properties); where my
> >> > properties are taken from a pre-initialized configuration.
> >> > One of the properties represent java.util.Date.
> >> > We have a simple date format class that sets the value:
> >> > SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy
> >> > HH:mm:ss");
> >> > when I just use the Names binding, I get the Guice creation exception
> >> > that the named field was not bound.
>
> >> Names.bindProperties(...) creates constant bindings for the properties
> >> map - constant bindings are converted from Strings to actual instances by
> >> TypeConverters:
>
> >>http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/injec...
>
> >> Guice provides built-in TypeConverters for primitive types, enums, and
> >> class literals - but not for Date, hence the creation exception. However,
> >> you can add your own:
>
> >>http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/injec...)
>
> >> See alsohttp://99soft.github.com/rocoto/which provides a range of

igor.petrouk

unread,
Jan 31, 2012, 10:37:41 AM1/31/12
to google-guice
Take a look at this test. It runs successfully. Is it very different
from how you do your code?

class MyClass{
  Date date;

  @Inject
  public MyClass(@Named("date") Date dt){
    this.date = dt;
  }
}

class DateTypeConverter implements TypeConverter{
  public Object convert(String value, TypeLiteral<?> toType) {
    return new Date();
  }
}

public class SimpleTest extends TestCase {
  class MyModule extends AbstractModule{
    @Override
    protected void configure() {
      Map<String, String> map = new HashMap<String, String>();
      map.put("date","something");
      Names.bindProperties(binder(), map);
      bind(MyClass.class);
      convertToTypes(Matchers.only(TypeLiteral.get(Date.class)), new
DateTypeConverter());
    }
  }

  public void test(){
      Injector injector = Guice.createInjector(new MyModule());
      MyClass aClass = injector.getInstance(MyClass.class);
}
}

Igor Petrouk

unread,
Jan 31, 2012, 10:31:29 AM1/31/12
to google...@googlegroups.com
2012/1/31 Stuart McCulloch <mcc...@gmail.com>

Igor Petrouk

unread,
Jan 31, 2012, 9:49:55 AM1/31/12
to google...@googlegroups.com
Hi.

What do you mean by this?

> We have a simple date format class that sets the value:
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");

Where does this format class appear?

2012/1/31 egolan <egol...@gmail.com>
Reply all
Reply to author
Forward
0 new messages