2016-10-14 4 views
1

Ich habe sehr große UserDto viele Felder, wie unten:Wie verstecken mit Springfox zusätzliche Anforderung Körperparameter in Swagger entfernen

public class UserDto implements Serializable { 
    private Long id; 
    @Column 
    private String username; 
    @Column 
    private String emailId; 
    @Column 
    private String password; 

    .... many other columns like above with getter/setter 
} 

Ich habe definiert authenticate Methode wie folgt:

@RequestMapping(value = "authenticate", consumes = "application/json", produces = "application/json", method = RequestMethod.POST) 
     @ApiOperation(value="authenticate user",notes="authenticate user for all roles") 
     @ApiResponses({ 
      @ApiResponse(code = 403, message = "BAD_CREDENCIAL_EXCEPTION",response=ExceptionMsgDto.class), 
      @ApiResponse(code = 404, message = "USERNAME_NOT_FOUND_EXCEPTION",response=ExceptionMsgDto.class) 
     }) 
     public ResponseEntity<Object> authenticate(@RequestBody UserDto userDto, HttpServletRequest request) 
       throws Exception { 
    /* business logic */ 
} 

, wenn ich generate swagger zeigt alle Eigenschaften von Userdto ins request model, möchte aber nur Benutzername/Passwort anzeigen und andere ausblenden. aber an der gleichen Stelle für createUser-Methode möchte ich alle Eigenschaften von UserDto zeigen.

Ich habe versucht, eine Lösung zu finden, bekam aber keine, ist das möglich? Bitte schlagen Sie mir einen Weg vor, dies zu erreichen.

Vielen Dank im Voraus.

Antwort

0

In Ihrem Fall sollten Sie besser DTOs verwenden, die für die Anfrage spezifisch sind, z. B. InsertUserDTO, UpdateUserDTO etc..und sollte offensichtlich keine Methoden außer vielleicht einfache Gettes/Setter enthalten.

In meinem Fall, was ich getan habe, da ich keine andere Abstraktionsschicht über meine Domain-Objekte hinzufügen wollte (ich gebe diese in den Controller-Methoden) wollte ich nur die Eigenschaften auf bestimmte Anfragetypen ausblenden, damit sie nicht Show on Swagger (ver 2.6.1).

Hier ist, was ich getan habe:

My Domain Objekt:

public class Entity { 
    private String name; 
    private String hideThis; 

    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 

    public String getHideThis() { return hideThis; } 
    public void setHideThis(String hideThis) { this.hideThis= hideThis; } 
} 

ich alle Eigenschaften mit Anmerkungen versehen ich versteckt werden soll! Funktioniert auch mit privaten Eigenschaften :)

import io.swagger.annotations.ApiModelProperty; 
public class EntityInsertRequest extends Entity {  

    @ApiModelProperty(hidden = true) 
    private User hideThis; 

} 

So kann ich kontrollieren kann, wie genau die Anforderung Körper in Prahlerei ui aussieht. Es kann für das Einfügen/Aktualisieren/Löschen unterschiedlich sein. Das hindert den Benutzer natürlich nicht daran, etwas zu senden, das noch serialisiert wird! Die Dokumentation der API ist ohne die zusätzliche Ebene der DTOs sauber, vorausgesetzt, Sie werden vor zufälligen Werten/Objekten geschützt, die an das Backend übergeben werden.

Hier ist meine Controller-Methode vor:

@RequestMapping(value = "entity", method = RequestMethod.POST) 
public Entity storeEntity(@RequestBody final EntityInsertRequest in) { 

    return entityService.store(in); 
} 
:

@RequestMapping(value = "entity", method = RequestMethod.POST) 
public Entity storeEntity(@RequestBody final Entity in) { 

    return entityService.store(in); 
} 

und hier meine Controller-Methode nach ist

Verwandte Themen