ClientLocaleThreadLocal

ClientLocaleThreadLocal

框架: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()是否是“客户端语言环境”,因为“客户端语言环境”有点模糊。

10-04 14:12