Как получить доступ к @PathVariable в начале вызова REST? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь получить доступ к переменной пути из URL-адреса запроса, определенного на уровне класса контроллера, с помощью метода, аннотированного @PostConstruct. Идея состоит в том, чтобы использовать эту переменную пути для инициализации локальной переменной в начале вызова API перед выполнением соответствующего метода контроллера. Это делается для того, чтобы избежать использования этого кусочного кода в каждом методе и просто позволить контроллеру установите переменную в начале вызова.

Код может объяснить это лучше:

@RestController
@RequestMapping("/path/{variable}")
public class BaseController {

    protected Object object;

    @PostConstruct
    protected void setObject(@PathVariable("variable") Long variable){
        this.object= objectRepository.findById(variable).get();
    }
}

Очевидно, что в этот момент я сталкиваюсь с ошибкой «Метод жизненного цикла требует метода без аргументов» - поэтому я знаю, что @PostConstruct - не тот путь, но мне интересно, есть ли другой способ добиться этого? , может быть, что-то вроде @Before для юнит-тестов?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Я бы не использовал аннотацию @Value, потому что вы распространяете всю логику конфигурации по всей системе. @ConfigurationProperties (см. Здесь: https://www.baeldung.com/configuration-properties-in-spring-boot) будет вашим другом. Вы также можете использовать другие типы объектов, а также проверку сверху.

Относительно @Before из модульных тестов: @PostConstruct вызывается после создания самого компонента, а не перед вызовом метода. Если вы хотите сделать что-то перед вызовом метода, ArgumentResolver или Aspect, использующий Spring AOP, станет вашим другом, я бы предпочел использовать ArgumentResolver и управлять всем изнутри. Еще раз, я сомневаюсь, что вы на самом деле делаете правильный дизайн, поскольку @Pathvariable должен предоставляться пользователем API, а не конфигурацией.

0 голосов
/ 11 января 2019

Вы можете использовать AOP с @Aspect для запуска фрагмента кода перед выполнением любого метода из BaseController.

Пожалуйста, посмотрите, как это реализовать. https://dzone.com/articles/aspect-oriented-programming-with-springboot

0 голосов
/ 11 января 2019

Я не уверен, зачем вам это на самом деле нужно. Pathvariable устанавливается внешне во время вызова REST. На этапе запуска у вас нет этой переменной пути, что означает, что вы не можете ничего из нее решить.

Чтобы лучше понять, чего вы пытаетесь добиться и почему он не работает, я бы порекомендовал прочитать эту короткую статью stackoverflow: Как именно работает Spring BeanPostProcessor?

Если у вас есть статические идентификаторы, я бы предпочел использовать ConfigurationProperties.

Не могли бы вы предоставить больше информации о том, чего именно вы пытаетесь достичь с помощью этого? Я лично попытался бы избежать глобальных переменных.

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