2010-12-28 10 views
0

フレームワーク:Spring、Hibernate。 O/S:WindowsHibernateメッセージ補間を実装するときのJavaジェネリックスのエラー

私は、このLinkの指示に従ってhibernateのカスタムメッセージ補間器を実装しようとしています。

以下のクラスを実装すると、「非静的型ロケールへの静的参照を作成できません」というエラーが発生します。

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 { 
} 

}

ウィル大丈夫以下のことをやって? TimeFilter非静的メソッド/フィールド

  • にClientLocaleThreadLocalで

    1. 変更静的メソッド/フィールド、以下のように新しいオブジェクトをインスタンス化することによってロケールを設定。事前にあなたの助けのための 新しいClientLocaleThreadLocal()。セット(req.getLocale())

    おかげ

  • 答えて

    1
    public class ClientLocaleThreadLocal<Locale> 
    

    Localeと呼ばれるタイプのパラメータを持つジェネリッククラスClientLocaleThreadLocalを宣言します。 ClientLocaleThreadLocalには常にLocaleが含まれているため、ここではtypeパラメータは必要ありません。

    private static ThreadLocal tLocal = new ThreadLocal(); 
    

    対照的にThreadLocalはジェネリック型であり、保持するオブジェクトの型を型パラメータとして持っています。あなたの場合、これはLocaleです。したがって、コードは次のようになります。

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

    ThreadLocalについては、そのJavadocまたはGoogleの名前を読んでください。

    res.getLocale()が「クライアントロケール」であるかどうかは、「クライアントロケール」が少し曖昧なためわからないものですか。

    +0

    ありがとうございます!たくさんのメリトン。これは私がこれを前進させるのに役立ちます。 ClientLocaleThreadLocalには常にロケールが含まれているため、ここではtypeパラメータは必要ありません。 「常にThreadLocal が含まれていますか? – Jayaprakash

    +0

    はい。重要なポイントは 'java.util.Locale'クラスを参照し、' Locale'という型パラメータを宣言したくないということです。 – meriton

    +0

    ありがとう!メリトン – Jayaprakash

    0

    「ロケール」は一般的なパラメータです。この特定の名前は、既存の型名と衝突するので、少し混乱します。慣例により

    、汎用パラメータ等T、L、I、のような単一文字の大文字は、典型的

    あなたが取得している特定のエラーメッセージ:Cannot make a static reference to the non-static type Locale

    は一般的なパラメータからですクラスレベルではinstance methodsではなくstatic methodsでのみ使用できます。これを1秒間考えてみましょう。ジェネリックパラメータは、通常、クラスの新しいインスタンスを作成するときに提供されますが、静的メソッドではインスタンスが存在しないため、実際のジェネリックパラメータを参照する方法はありません。

    など。あなたが使用する一般的なパラメータを使用します

    ClientLocaleThreadLocal<MyLocale> clt = new ClientLocaleThreadLocal<MyLocale>(); 
    clt.set(someMyLocaleInstance); 
    

    をしかし、静的メソッドで、あなたは、単にこの呼び出し:

    ClientLocaleThreadLocal.set(someMyLocaleInstance); 
    

    そして、あなたが見るように、一般的なパラメータが供給されていません。

    元のJBossの例は完全には正しくありません。

    +0

    ありがとう!解明のためのArjan。 – Jayaprakash

    関連する問題