Есть ли способ заставить Spring проверять выражения EL при запуске приложения? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть конечные точки в @RestController s, которые выглядят примерно так:

@RestController
@RequestMapping("/rest/x")
public class XApiController
{

    // ...

    @PostMapping(...)
    @PreAuthorize("@apiAuthService.canAccessX(#headers)")
    public void saveX(...)
    {
        // ...
    }
}

Эти конечные точки требуют от разработчика сделать объект HttpHeaders доступным и правильно назвать его в объявлении метода:

public void saveX(@RequestHeader HttpHeaders headers)

Наша проблема в том, что если этот последний шаг не будет выполнен, конечная точка завершится с ошибкой только во время выполнения, когда вызывается конечная точка.Это означает, что проблемы с большими рефакторингами позже (скажем, для изменения аргумента HttpHeaders на HttpServletRequest) нелегко идентифицировать.Есть ли способ сообщить Spring, что эти выражения действительны при запуске приложения?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Spring всегда проверяет все бины при запуске. Но ваша проблема не в валидации, ваша проблема - тестовая проблема. Процесс предварительной авторизации является рабочим заданием. Spring не может знать, что делать с этим выражением, Spring просто проверяет его синтаксис по правилам SPEL.

  1. Вы можете создавать тесты для проверки заголовка.
  2. Вы можете увеличить свой уровень проверки IDE пружины до ошибки.
  3. Вы можете просто написать статический метод для получения заголовков без параметра rest.
0 голосов
/ 14 мая 2019
  • Я предлагаю вам создать интеграционные тесты, а затем вызвать saveX из теста, чтобы проверить это перед развертыванием приложения.

Я бы также высказал свое мнение, что если вы хотитечтобы иметь тестируемый код с хорошим качеством - постарайтесь избавиться от SpringEL как можно скорее.По моему опыту, этот подход оказался плохо проверяемым, трудно обслуживаемым и также вносил ненужные сложности в ваш исходный код.

В современной среде Spring существует множество способов избежать написания SpringEl.

...