2017-03-13 2 views
3

Dans notre API REST, nous devons être capables de prendre en charge plusieurs locataires. Pour achiving ce tous les contrôleurs repos sous-classe un contrôleur REST commune qui définit un préfixe de mappage de demande et expose un attribut de modèle comme suitDocumenter automatiquement les paramètres annotés @PathVariable dans les méthodes annotées @ModelAttribute

@RequestMapping(path = "/{tenantKey}/api") 
public class ApiController { 

    @ModelAttribute 
    public Tenant getTenant(@PathVariable("tenantKey") String tenantKey) { 
    return repository.findByTenantKey(tenantKey); 
    } 

} 

contrôleurs dérivés utilisent le modèle des attributs dans leurs méthodes de cartographie de demande:

@RestController 
public class FooController extends ApiController { 

    @RequestMapping(value = "/foo", method = GET) 
    public List<Foo> getFoo(@ApiIgnore @ModelAttribute Tenant tenant) { 
    return service.getFoos(tenant); 
    } 

} 

Ce point final est bien documenté dans le swagger-ui. Je reçois un point de terminaison documenté avec un mappage GET pour le chemin /{tenantKey}/api/foo.

Mon problème est que la variable de chemin {tenantKey} n'est pas documentée dans swagger-ui en tant que paramètre. La section paramètres dans swagger n'est pas rendue du tout. Si j'ajoute un paramètre String à la méthode du contrôleur, l'annoter avec @PathVariable("tenantKey) tout va bien, mais je ne veux pas de paramètre tenantKey dans ma méthode de contrôleur, puisque le locataire résolu est déjà disponible en tant qu'attribut de modèle. Donc ma question est: Y at-il un moyen d'obtenir le @PathVariable de la méthode annotée @ModelAttriute dans ApiController documenté dans swagger-ui dans cette configuration?

-Configuration du projet est

  • Printemps-Boot (1.4.2)
  • springfox-swagger2 (2.6.1)
  • springfox-fanfaronnades-ui (2.6.1)

Répondre

1

C'est certainement possible. Les attributs de modèle sur les méthodes ne sont pas pris en charge actuellement. Au lieu de cela, vous pourriez adopter l'approche suivante.

  1. Mark la méthode getTenant avec un @ApiIgnore (pas sûr si elle est traitée comme une cartographie de la demande.)
  2. Dans votre dossier, vous pouvez ajouter tenantKey variable chemin global (à tous les points finaux). Comme il s'agit d'une application multi-tenant, cela suppose que cela s'applique à tous les points de terminaison.
+0

Merci pour votre réponse. J'ai configuré une variable de chemin globale et cela résout parfaitement mon problème. Btw: La méthode 'getTenant' n'est pas traitée comme un mappage de requête. Il ne fait l'objet d'aucune documentation, mais c'est le comportement auquel je m'attendais puisqu'il ne fonctionne que de manière interne et qu'il n'a aucune influence sur l'API REST. –