Построение значений конечной точки из функции - значение атрибута аннотации X должно быть константным выражением - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь построить значение конечной точки из строки, построенной функцией, как показано ниже:

ManagerController.java

@Controller
@RequestMapping(value = "/manager/")
public class ManagerController {
    @Autowired
    Manager manager;

    public String endpointBuilder(String str) {
        return "storage/" + str;
    }

    public String storeEndpoint = endpointBuilder("{store}");

    @PostMapping(value = storeEndpoint)
    private ResponseEntity<?> storeSomething(String str) {
        manager.storeSomething(str);
        return new ResponseEntity<>(CREATED);
    }
}

Строка @PostMapping(value = storeEndpoint) приводит к ошибке The value for annotation attribute PostMapping.value must be a constant expression.Проект, над которым я работаю, имеет большое количество похожих имен конечных точек, и мне было бы полезно использовать endpointBuilder(), особенно для обеспечения единообразия имен между контроллером REST и его модульными тестами, но я застрял в том, чтобы понять, каксделай так, чтоб это работало.Остальная часть этого примера кода приведена ниже.

Application.java

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }

}

Manager.java

@Component
public class Manager {
    private List<String> storage;

    @Autowired
    public Manager() {
        this.storage = new ArrayList<String>();
    }

    public void storeSomething(String str) {
        storage.add(str);
    }
}

Как мне выполнить то, что я пытаюсь сделать, если это возможно?Если это невозможно, есть ли альтернативный способ достижения подобного эффекта?

1 Ответ

0 голосов
/ 09 февраля 2019

Это невозможно.Начиная с JLS, §9.7.1 :

Тип элемента T соизмерим со значением элемента V тогда и только тогда, когда выполняется одно из следующих условий:

  • T - это тип массива E[] и либо:

    • V - это ElementValueArrayInitializer и каждое ElementValue (аналогичноVariableInitializer в инициализаторе массива) в V соответствует E;или

    • V - это ElementValue, соразмерное с E.

  • Тип V совместим с присвоением (§5.2) с T, и, кроме того:

    • Если T является примитивным типом или String, а V является константным выражением (§15.28).

    • V не равно нулю.

    • Если T равно Class, или вызов Class и V - литерал класса (§15.8.2).

    • Если T является типом перечисления, а V является константой перечисления.

По существу, только константы времени компиляции допускаются в качестве значений для элементов аннотации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...