web-dev-qa-db-ja.com

Swagger応答からモデルまたはプロパティを除外する

私は、Apache cxfプロジェクトでswaggerを使用し、@ Apiと@ApiOperationsおよび@ApiParamアノテーションを使用して、残りのサービス用のapi docを生成しました。

ただし、EntityTag、StatusType、MediaTypeなどの一部のフィールドを、Models属性または完全なモジュールまたはプロパティ属性から除外したいと考えています。

どうやってするか?

私はデータベースからデータをフェッチしてユーザーオブジェクトに設定し、そのユーザーオブジェクトをJAX-RS応答ビルダーに渡していました。

以下は、私のDTOオブジェクトの1つです。

  @ApiModel
  public class User{
  private String name;
   private String email;


 @ApiModelProperty(position = 1, required = true, notes = "used to display user name")
 public int getName() {
    return name;
 }

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

@ApiModelProperty(position = 2, required = true, notes = "used to display user email")
public int getEmail() {
    return email;
}

 public void setEmail(String email) {
    this.email= email;
 }

これで、Swaggerによって返されたjson形式内にユーザーオブジェクトフィールドまたはプロパティが表示されません。

私のサービスクラスメソッドの応答は:

    @GET
    @ApiOperation(value = "xxx", httpMethod = "GET", notes = "user details", response =  Response.class)
   public Response getUserInfo(){
        User userdto = userdaoimpl.getUserDetails();
        ResponseBuilder builder = Response.ok(user, Status.OK), MediaType.APPLICATION_JSON);
        builder.build();
 }


<bean id="swaggerConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig">
    <property name="resourcePackage" value="com.services.impl" />
    <property name="version" value="1.0.0" />
    <property name="basePath" value="http://localhost:8080/api" />
    <property name="license" value="Apache 2.0 License" />
    <property name="licenseUrl"
        value="http://www.Apache.org/licenses/LICENSE-2.0.html" />
    <property name="scan" value="true" />
 </bean>
8
LazyGuy

まず、最新のswagger-coreバージョン(現在は1.3.12)にアップグレードする必要があります(本当に古いバージョンを使用しています)。

プロパティを非表示にする方法は3つあります。

  1. JAXBアノテーションを使用している場合は、@XmlTransientを使用できます。
  2. ジャクソンを使用している場合は、@JsonIgnoreを使用できます。
  3. どちらも使用していない場合、またはモデルの一般的な逆シリアル化に影響を与えたくない場合は、Swaggerの @ApiModelPropertyhidden属性 を使用できます。

プロパティ自体ではなく、ゲッター/セッターでこれらを設定する必要がある場合があることに注意してください。定義を試して、何が効果的かを確認してください。

Userモデルの問題に関しては、@ApiOperationから参照しないことが問題です(httpMethodプロパティも必要ありません)。次のように変更してみてください。

@ApiOperation(value = "xxx", notes = "user details", response =  User.class)
25
Ron

そのようなフィールドを除外することができます:

@ApiModelProperty(position = 1, required = true, hidden=true, notes = "used to display user name")
3
Loran92