2015-04-30 10 views
23

Dato un'applicazione di avvio molla "standard" con un @RestController, ad esempioUn avvio a molla @RestController può essere abilitato/disabilitato utilizzando le proprietà?

@RestController 
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8") 
public class MyController { 
    @RequestMapping(value = "bar") 
    public ResponseEntity<String> bar(
     return new ResponseEntity<>("Hello world", HttpStatus.OK); 
    } 
} 

C'è un'annotazione o tecnica che impedisce l'endpoint avvio affatto se/meno che non esista una certa proprietà un'applicazione/Non esistere.

Nota: il test di una proprietà all'interno del metodo e l'esplosione non sono una soluzione, poiché il punto finale esisterà.

Non mi interessa la granularità: vale a dire abilitare/disabilitare solo un metodo o l'intera classe vanno bene entrambi.


Poiché un profilo non è una proprietà, il controllo tramite i profili non risolve il mio problema.

risposta

34

ho trovato una soluzione semplice utilizzando @ConditionalOnExpression:

@RestController 
@ConditionalOnExpression("${my.controller.enabled:false}") 
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8") 
public class MyController { 
    @RequestMapping(value = "bar") 
    public ResponseEntity<String> bar(
     return new ResponseEntity<>("Hello world", HttpStatus.OK); 
    } 
} 

Con questa annotazione aggiunto, se non ho

my.controller.enabled=true 

nel mio file application.properties, il controller non si avvia affatto.

È inoltre possibile utilizzare il più conveniente:

@ConditionalOnProperty("my.property") 

che si comporta esattamente come sopra; se la proprietà è presente e "true", il componente si avvia, altrimenti non lo fa.

+9

Si potrebbe voler considerare '@ ConditionalOnProperty' perché è leggermente più veloce della valutazione SpEL. Prova '@ConditionalOnProperty (prefix =" my.controller ", name =" enabled ")' –

+0

Grazie, un ulteriore chiarimento su quale livello questa annotazione può essere applicata: http://stackoverflow.com/questions/30065945/conditionalonproperty-conditionally -works – codesalsa

+1

Utilizzo di ConditionalOnProperty o ConditionalOnExpression dopo RestController non funziona per me. Bean è in fase di creazione Gli URL sono ancora accessibili seguendo i registri di AdminController RestController: DozerInitializer - Dozer JMX MBean [org.dozer.jmx: type = DozerAdminController] è registrato automaticamente con il Platform MBean Server? –

Problemi correlati