5

У меня есть контроллер пружины с несколькими (REST) ​​оконечными точками. Я хочу вызвать несколько экземпляров этого контроллера, где каждый экземпляр будет иметь несколько конечных точек, выборочно включенных/отключенных.Аннотации для функции flipping Конечные точки REST

Основываясь на моем чтении до сих пор, togglz обеспечивает переключение функций, но он не включает/отключает конечные точки REST (togglz предоставляет API, чтобы код вызывающего абонента мог проверить, включена ли функция); ff4j представляется другой альтернативой, но это было не очень очевидно из документации, если она может включать/отключать конечные точки REST

Я прочитал нить Feature Toggling Java Annotations, но это более длинная реализация. Есть ли какой-либо пакет, который я могу использовать для указания конечных точек, которые необходимо включить/отключить в файле конфигурации, и использовать аннотацию на конечных точках REST, чтобы отключить/включить их (таким образом, логика в моем методе остается нетронутой и минимизирует тестирование)

ответ

3

Класс с @Bean или @Component будет загружен весной при запуске через механизм просмотра bean. Чтобы исключить этот компонент из контекста Spring при запуске, вы можете создать BeanPostProcessor (here) и проверить выделенную аннотацию, но насколько я понимаю, вы не можете вернуть компонент в контекст во время выполнения.

Как следствие, вы должны сделать этот боб «умный» для выполнения правильной работы/издеваются (или отправить 503 HTTP код), когда запросы приходят в.

FF4j действительно может помочь вам реализации этого поведения, но не с отдельную аннотацию поверх вашего контроллера REST. Что вы можете сделать:

  • Создайте интерфейс, аннотировать интерфейс с выделенным FF4J аннотацией
  • Созданием 2 реализаций интерфейса, каждый раз с другим именем
  • Использование FF4J выбрать реализацию или другие во время выполнения.

Вот некоторые фрагменты коды, чтобы получить представление:

public interface GreetingService { 
    @Flip(name = "theFeatureIDToToggle", alterBean = "greeting.french") 
    String sayHello(String name); 
} 

@Component("greeting.french") 
public class GreetingServiceFrenchImpl implements GreetingService { 
    public String sayHello(String name) {return "Bonjour " + name; 
} 

@Component("greeting.english") 
public class GreetingServiceEnglishImpl implements GreetingService { 
    public String sayHello(String name) {return "Hello " + name; 
} 

//... import 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:applicationContext-ff4j-aop-test.xml") 
public class FeatureAdvisorTest { 

    @Autowired 
    private FF4j ff4j; 

    @Autowired 
    @Qualifier("greeting.english") 
    private GreetingService greeting 

    @Test 
    public void testAnnotatedFlipping_with_alterBean() { 
     ff4j.disable("theFeatureIDToToggle"); 
     Assert.assertTrue(greeting.sayHello("CLU").startsWith("Hello")); 

     ff4j.enable("theFeatureIDToToggle"); 
     Assert.assertTrue(greeting.sayHello("CLU").startsWith("Bonjour")); 
    } 
} 

Вы можете переключать один метод или весь класс, как вы хотите все образцы доступны here.

Смежные вопросы