有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于翻转其余端点的功能的java注释

我有一个带有多个(REST)端点的spring控制器。我想提出这个控制器的多个实例,其中每个实例都有几个端点被选择性地启用/禁用

根据我到目前为止的阅读,togglz提供了功能翻转,但它没有启用/禁用其余端点(togglz提供了API,以便调用方代码可以检查功能是否已启用);ff4j似乎是另一种选择,但从文档中看,它是否可以启用/禁用REST端点并不十分明显

我阅读了线程Feature Toggling Java Annotations,但它是一个较长的实现。是否有任何包可用于指定需要在配置文件中启用/禁用的端点,并使用REST端点上的注释来禁用/启用它们(这样,我的方法中的逻辑保持不变并最小化测试)


共 (1) 个答案

  1. # 1 楼答案

    带有@Bean@Component的类将由spring在启动时通过bean访问者机制加载。要在启动时从Spring上下文中排除这个bean,您可以创建一个BeanPostProcessorhere)并检查专用注释,但据我所知,您不能在运行时将bean放回上下文

    因此,您必须使这个bean“智能化”,以便在收到请求时执行正确的操作/模拟(或发送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