2015-10-13 47 views
5

我有几个(REST)端点的弹簧控制器。我想调出这个控制器的多个实例,其中每个实例将有几个端点选择性地启用/禁用。基于我迄今为止的阅读,togglz提供了功能翻转,但它不启用/禁用REST端点(togglz提供API,以便调用者代码可以检查功能是否启用); ff4j似乎是另一种选择,但它从文档中不是很明显,如果它可以启用/禁用REST端点功能翻转REST端点的注释

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

回答

3

在启动时将通过bean访问机制在弹出窗口中加载一个带有@Bean@Component的类。要在启动时从Spring上下文中排除这个bean,你可以创建一个BeanPostProcessorhere)并检查专用注释BUT,据我所知,你不能在运行时将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