上下文:使用Guice 3.0的Java
'大家好,我正在尝试为我的网络应用程序构建一个不错的转换器库 转换器允许我从未知类型转换为另一种类型。
要转换类型,我正在使用Guice MultiBinder的转换器注册表,如this one (following @Ivan Sopov's implementation)
一个例子可能更明确:
**NOTICE : this is not a working example**
//"obj" is an object with unknowed type, and we want to convert it to another type)
Converter c = converterRegistry.getConverter(obj.getClass(),type.getClass());
Object t = c.convert(obj); //obj is now converted !
我可以有很多种转换器:StringToInteger,StringToDouble等;对于那些简单的我没有问题。
public interface Converter<F,T>{
public T convert(F from);
}
public class StringToInteger implements Converter<String,Integer>{
public Integer convert(String from){
return Integer.valueOf(from);
}
}
当我必须实现需要更多参数的转换器(转换类型的特定信息)时出现问题。
例如:DateToString转换器
在这种情况下,我将使用当前用户Locale将Date格式化为String。
目前我正在使用另一个参数来解决问题,我的转换器界面就是这样:
public interface Converter<F,T>{
public T convert(F from, ConverterData data);
}
public class ConverterData{
private Locale locale;
//... many other object that can be usefull for other converter...
}
public class DateToString implements Converter<Date,String>{
public String convert(Date from, ConverterData data){
//using data.getLocale() to convert the Date to String and return it
}
}
现在,我正在寻找更好的解决方案来改进代码。我想过使用Guice的一些可能的解决方案,但我并不完全相信......
以下是其中之一:
public class DateToString implements Converter<Date,String>{
private Provider<Locale> providerLocale;
@Inject
public DateToString(Provider<Locale> providerLocale){
this.providerLocale = providerLocale;
}
public String convert(Date from){
//using providerLocale.get() to convert the Date
}
}
在这里,我正在使用提供商,因为转换器可能在@Singleton ...中 (也许我使用提供商时错了?)
- 我该怎么做?
好吧,我试图充分解释我的问题。我希望有人会花时间阅读:)
我在等你的帮助,提前谢谢! PS:很难找到这篇文章的标题,欢迎提出任何建议!
答案 0 :(得分:0)
看起来你想要一个由当前请求的语言环境状态配置的转换器。
您与提供商走在正确的轨道上。你给我发声的原因。我会解释一下。
因为你将使用converterRegistry来获取转换器,所以看起来你将为每个请求使用相同的对象。
供应商是工厂,使用guice来提供价值。由于您希望使用每个请求状态配置DataToString转换器,因此您可以为重用对象上的convert方法的每次调用配置语言环境。
接下来,您需要创建一个Guice提供程序类或Local方法。如果你已经知道如何做到这一点,那就完成了。
为了更全面地集成guice,我建议您使用Guice-servlet将其插入到您的请求中:http://code.google.com/p/google-guice/wiki/Servlets