Подтвердить что ты не робот

Java-код не будет компилироваться из-за атрибута, должен быть константной ошибкой выражения

Я не могу понять, почему следующее не будет компилироваться. Ошибка, которую IDE дает мне: "Значение атрибута аннотации RequestParam.defaultValue должно быть постоянным выражением".

Мой проект включает Spring и 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);
}

Я думаю, что ошибка возникает из преобразования Long в String, но я не знаю, как это исправить. Я буду признателен за любую помощь, я новичок в аннотации и Spring.

4b9b3361

Ответ 1

В правилах Java говорится, что когда у вас есть аннотация, и у нее есть параметр, который ожидает примитивный тип (например, int) или String, значение должно быть постоянным выражением. [Это не имеет ничего общего с Spring.] Грубо говоря, константное выражение - это значение, значение которого компилятор может определить во время компиляции. Однако существуют правила для того, что представляет собой постоянное выражение. Эти правила находятся в JLS 15.28. В постоянном выражении могут использоваться только определенные типы операций. Вызов метода, такой как Long.toString(), не является одним из них. Поэтому использование этого выражения не является постоянным выражением, хотя оно выглядит так, как должно быть. (Это похоже на вас, потому что вы знаете, что делает Long.toString. Однако компилятор не сохраняет каталог всех методов, чтобы знать, какие из них являются "постоянными" методами, значения которых можно вычислить во время компиляции.)

Однако пример в ссылке показывает, что оператор + может использоваться, даже если один из аргументов не является строкой, и поэтому метод toString() неявно называется. Это говорит о том, что вы можете заставить все работать так:

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

Я еще не пробовал.