框架:Spring,Hibernate。操作系统:Windows
我试图按照此Link的方向实施休眠的自定义消息插值器。
当实现下面的类时,它给出错误“无法对非静态类型的Locale进行静态引用”。
public class ClientLocaleThreadLocal<Locale> {
private static ThreadLocal tLocal = new ThreadLocal();
public static void set(Locale locale) {
tLocal.set(locale);
}
public static Locale get() {
return tLocal.get();
}
public static void remove() {
tLocal.remove();
}
}
由于我不太了解泛型,因此不确定下面的TimeFilter类如何使用以及上面的类中的定义目的。
public class TimerFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
try {
ClientLocaleThreadLocal.set(req.getLocale());
filterChain.doFilter(req, res);
}finally {
ClientLocaleThreadLocal.remove();
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}
可以进行以下操作吗?
将ClientLocaleThreadLocal中的静态方法/字段更改为非静态方法/字段
在TimeFilter中,通过实例化新对象来设置语言环境,如下所示。
新的ClientLocaleThreadLocal()。set(req.getLocale())
谢谢您的帮助
最佳答案
public class ClientLocaleThreadLocal<Locale>
声明具有类型参数
ClientLocaleThreadLocal
的泛型类Locale
。由于ClientLocaleThreadLocal始终包含语言环境,因此此处不需要类型参数。private static ThreadLocal tLocal = new ThreadLocal();
相比之下,ThreadLocal是泛型类型,其拥有的对象类型作为类型参数。您的情况是
Locale
。因此,您的代码应为:public class ClientLocaleThreadLocal {
private static ThreadLocal<Locale> tLocal = new ThreadLocal<Locale>();
至于ThreadLocal是什么,请阅读其Javadoc或google的名称。
我们不知道
res.getLocale()
是否是“客户端语言环境”,因为“客户端语言环境”有点模糊。