Я могу включить / отключить весь @RestController с помощью @ConditionalOnProperty, например:
@RestController
@ConditionalOnProperty(name = "com.example.api.controller.decision.DecisionController.enabled", havingValue = "true")
@RequestMapping("/v1.0/decisions")
public class DecisionController {
}
Следующая конфигурация работает нормально. Но мне нужно иметь более точный контроль над этим контроллером и включать / отключать доступ к определенным методам внутри, например:
@RestController
@ConditionalOnProperty(name = "com.example.api.controller.decision.DecisionController.enabled", havingValue = "true")
@RequestMapping("/v1.0/decisions")
public class DecisionController {
@ConditionalOnProperty(name = "com.example.api.controller.decision.DecisionController.create.enabled", havingValue = "true")
@PreAuthorize("isAuthenticated()")
@RequestMapping(method = RequestMethod.POST)
public DecisionResponse create(@Valid @RequestBody CreateDecisionRequest request, Authentication authentication) {
...
}
}
Как видите, я добавил @ConditionalOnProperty в метод create, но этот подход не работает, и в случае включения DecisionController метод create также включен, даже если свойство com.example.api.controller.decision.DecisionController.create.enabled отсутствует в моем application.properties.
Как правильно включить / выключить метод create в этом случае?
@JBNizet У меня есть основной проект (модуль Maven), который определяет основные конечные точки и методы. Кроме того, у меня есть подмодуль Maven для конкретного проекта, который включает упомянутый основной модуль в качестве зависимости. Исходя из бизнес-потребностей и конфигурации моего проекта подмодуля, мне нужно скрыть некоторые основные функции (некоторые методы), унаследованные от основного проекта. Прямо сейчас я могу скрыть весь контроллер, но мне нужен более детализированный элемент управления.
Самый простой способ - это, вероятно, использовать фильтр и перехватывать запросы к определенным URL-адресам / методам HTTP и возвращать 404, если они отключены.
Отвечает ли это на ваш вопрос? Можно ли включить / отключить весеннюю загрузку @RestController с помощью свойств?




Unfortunately, the @ConditionalOnProperty annotation can’t be used on a single @RequestMapping method. As a workaround, you can move the desired mapping to a separate controller bean.
http://dolszewski.com/spring/feature-toggle-spring-boot/
Надеюсь, это поможет человеку, который зашел на эту страницу с тем же вопросом.
Вы также можете использовать aop, чтобы не продолжать выполнение метода и не возвращать пользователю некоторый статус. Я использую здесь аннотацию, чтобы отмечать / идентифицировать отключенные методы. Вы можете добавить атрибуты к этой аннотации, если хотите отключить на основе определенных значений в атрибутах. Например, вы можете добавить одно и то же имя свойства и имеющее значение, искать их и так далее ...
@Retention(RUNTIME)
@Target(METHOD)
public @interface DisableMe {}
Аспект:
@Aspect
@Component
public class DisableCertainAPI {
@Autowired private HttpServletResponse httpServletResponse;
@Pointcut(" @annotation(disableMe)")
protected void disabledMethods(DisableMe disableMe) {
// disabled methods pointcut
}
@Around("disabledMethods(disableMe)")
public void dontRun(JoinPoint jp, DisableMe disableMe) throws IOException {
httpServletResponse.sendError(HttpStatus.NOT_FOUND.value(), "Not found");
}
}
и по целевым методам:
@DisableMe
@GetMapping(...)
public ResponseEntity<String> doSomething(...){
logger.info("recieved a request");
}
вы увидите такой ответ:
{
"timestamp": "2019-11-11T16:29:31.454+0000",
"status": 404,
"error": "Not Found",
"message": "Not found",
"path": "/xyz/...."
}
Просто любопытно: каков вариант использования? Почему вы хотите отключить некоторые методы?