2016-08-26 29 views
15

次のコードがコンパイルされない理由がわかりません。 IDEが私に与えるエラーは、 "RequestParam.defaultValueアノテーション属性の値は定数式でなければなりません"です。属性が定数式エラーでなければならないため、Javaコードはコンパイルされません

私のプロジェクトでは、春とMavenを含み、それは次のように行く:

private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE); 

@RequestMapping(method=RequestMethod.GET) 
public List<Spittle> spittles(
     @RequestParam(value="max", 
        defaultValue=MAX_LONG_AS_STRING) long max, 
     @RequestParam(value="count", defaultValue="20") int count) { 
    return spittleRepository.findSpittles(max, count); 
} 

私はエラーがStringにロングの変換から来ていると思っていますが、私はそれを修正する方法がわかりません。私は助けを感謝します、私は注釈と春に新しいです。

+0

「定数式でなければならない」の部分は分かりませんか? – EJP

+8

@EJPたぶん彼女は定数のように見えるものが本当に定数ではないことを理解していないでしょうか?これは簡単なことではありません。 – ajb

+1

それは私のものと同じあなたの例が幻想的です、私は「行動の春」も読んでいます。そのような種類の間違いが多い –

答えて

27

Javaのルールを使用すると、注釈を持っており、それが(例えばintなど)、プリミティブ型またはStringを期待するパラメータを持っている場合、値は定数式でなければならないと言います。 [これはSpringとは関係ありません]大まかに言えば、定数式は、コンパイラがコンパイル時に把握できる値です。ただし、定数式を構成するルールがあります。これらのルールはJLS 15.28です。定数式では、特定のタイプの演算しか使用できません。 Long.toString()のようなメソッド呼び出しはそれらの1つではありません。したがって、それを使用すると、式ではなく、が定数式になります。 (Long.toStringが何であるか知っているので、あなたのように見えますが、コンパイラはすべてのメソッドのカタログを保持しておらず、コンパイル時に値が決まる「定数」メソッドを知りません)

ただし、リンクの例では、引数の1つが文字列ではないため、toString()メソッドが暗黙的に呼び出された場合でも、+演算子を使用できます。これは、次のように動作させることができる可能性があることを示しています。

private static final String MAX_LONG_AS_STRING = "" + Long.MAX_VALUE; 

私はそれを試していません。

+0

ああ!あなたの助けをありがとう、私に与えたオプションはうまくいきます!そしてあなたが与えたリンクと説明は、定数表現についてもっと理解するのを助けました。私はもっ​​と調査するまでのコンパイル時の違いについては気づいていませんでしたが、メソッドの使い方と何か関係があることは分かっていませんでした。簡潔ですばらしい説明をいただきありがとうございます! –

+0

'toString()'は実行時のメソッド呼び出しです。 '' + 5'はコンパイル時に定数文字列を作成します(これは不変です) - 私は間違っている可能性があります – junvar

+0

@junvarコンパイラが 'Long.toString(Long.MAX_VALUE)'の定数文字列を作成することを防ぎません。複数のJavaコンパイラがあり、それぞれを一定の文字列に最適化するかどうかを決定できます。しかし、合法であるかどうかについてのJavaの規則は、コンパイラに関係なく同じです。適法性の規則は、コンパイラが行うかもしれないし、しないオプションの最適化にも依存しない。 – ajb

関連する問題