2015-10-13 69 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