ePages-de / restdocs-api-spec

Adds API specification support to Spring REST Docs
MIT License
391 stars 103 forks source link

optional() is not working in OpenAPI 3 #213

Open tabuyos opened 1 year ago

tabuyos commented 1 year ago

First of all thank you very much for your contribution on rest docs.

Here is my debug screenshot

image

and section of resource.json

"requestFields" : [{
      "attributes" : { },
      "description" : "",
      "ignored" : false,
      "path" : "nickname",
      "type" : "STRING",
      "optional" : false
    }, {
      "attributes" : { },
      "description" : "",
      "ignored" : false,
      "path" : "avatar",
      "type" : "STRING",
      "optional" : true
    }, {
      "attributes" : { },
      "description" : "",
      "ignored" : false,
      "path" : "gender",
      "type" : "NUMBER",
      "optional" : true
    } ]

and section of openapi3.yaml

    UserSignUpMessage:
      title: UserSignUpMessage
      type: object
      properties:
        gender: {type: number, description:}
        avatar: {type: string, description: }
        nickname: {type: string, description:}

Each section is relatively complete, I have read #90 #172 that It doesn't seem to help me much. I'm not sure if I'm missing something, or doing something stupid

:)

tabuyos commented 1 year ago

I read the relevant source code carefully and found that the required properties is not filled with optional(), on the contrary, this should be a very complicated process. My unit test uses Map.class to pass and receive json parameters, it cannot be constructed using ConstrainedFields relevant constraints, maybe I missed something... tell me if you know please.

For this problem, I found a compromise solution after reading the source code

...
// define a function
protected Attributes.Attribute required() {
    List<Constraint> constraints = Lists.newArrayList(new Constraint("javax.validation.constraints.NotNull", Collections.emptyMap()));
    return Attributes.key("validationConstraints").value(constraints);
  }
...
// and use it.
fieldWithPath("field").attributes(required()).description("description")
...

Maybe there is a better solution...

My English is not as fluent as Chinese, I'm sorry for that.

Thanks again for your contribution.

xeromank commented 1 year ago

https://github.com/ePages-de/restdocs-api-spec/pull/244