5

Ho un controller a molla con diversi endpoint (REST). Voglio far apparire più istanze di questo controller in cui ogni istanza avrebbe pochi endpoint abilitati/disabilitati.Annotazioni per il ribaltamento delle funzioni Punti finali REST

Sulla base della mia lettura fino ad ora, togglz fornisce il capovolgimento delle funzioni, ma non abilita/disabilita gli endpoint REST (togglz fornisce API in modo che il codice del chiamante possa controllare se una funzionalità è abilitata); ff4j sembra essere un'altra alternativa, ma non è molto evidente dalla documentazione se può abilitare/disabilitare punti finali REST

Ho letto la discussione Feature Toggling Java Annotations ma è un'implementazione più lunga. C'è un pacchetto che posso usare per specificare gli endpoint che devono essere abilitati/disabilitati in un file di configurazione e usare annotazioni sugli endpoint REST per disabilitarli/abilitarli (in questo modo la logica del mio metodo rimane intatta e minimizza i test)

risposta

3

Una classe con @Bean o @Component verrà caricata da spring all'avvio attraverso il meccanismo di bean bean. Per escludere questo bean dal contesto Spring all'avvio è possibile creare un BeanPostProcessor (here) e controllare l'annotazione dedicata MA a mio avviso, non è possibile riportare il bean al contesto in fase di runtime.

Di conseguenza, è necessario effettuare questo fagiolo 'intelligente' per eseguire il corretto funzionamento/finto (o inviare 503 codice HTTP) quando le richieste sono disponibili in.

FF4j può infatti aiutare a implementare questo comportamento, ma non con una singola annotazione sopra il tuo controller REST. Che cosa si potrebbe fare:

  • creare un'interfaccia, annotare l'interfaccia con l'annotazione FF4J dedicato
  • creare 2 implementazioni dell'interfaccia, ogni volta con un nome diverso
  • Usa FF4J di scegliere un'implementazione o di un altro in fase di esecuzione.

Ecco qualche frammento di codice per ottenere l'idea:

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")); 
    } 
} 

è possibile passare un singolo metodo o tutta la classe, come si desidera tutti i campioni sono disponibili here.

Problemi correlati