gpt4 book ai didi

实现 Hibernate 消息插值器时出现 Java 泛型错误

转载 作者:行者123 更新时间:2023-12-01 15:58:25 24 4
gpt4 key购买 nike

框架:Spring、Hibernate。操作系统:Windows

我正在尝试按照此 Link 的方向实现 hibernate 的自定义消息插值器.

实现以下类时,出现错误“无法对非静态类型 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 {
}

}

执行以下操作可以吗?

  1. 将ClientLocaleThreadLocal中的静态方法/字段更改为非静态方法/字段

  2. 在 TimeFilter 中,通过实例化新对象来设置区域设置,如下所示。new ClientLocaleThreadLocal().set(req.getLocale())

感谢您提前提供的帮助

最佳答案

public class ClientLocaleThreadLocal<Locale>

声明一个泛型类ClientLocaleThreadLocal具有名为 Locale 的类型参数。由于 ClientLocaleThreadLocal 始终包含 Locale,因此此处不需要类型参数。

private static ThreadLocal tLocal = new ThreadLocal();

相比之下,ThreadLocal 是一种泛型类型,并且具有它所保存的对象类型作为类型参数。在您的情况下,这是 Locale 。因此,您的代码应为:

public class ClientLocaleThreadLocal {
private static ThreadLocal<Locale> tLocal = new ThreadLocal<Locale>();

至于 ThreadLocal 是什么,请阅读其 Javadoc 或 google 其名称。

是否res.getLocale() “客户端区域设置”是我们无法知道的,因为“客户端区域设置”有点模糊。

关于实现 Hibernate 消息插值器时出现 Java 泛型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com