当 API 中未发送必填字段值时,如何在 swagger 中自定义错误消息?

Posted

技术标签:

【中文标题】当 API 中未发送必填字段值时,如何在 swagger 中自定义错误消息?【英文标题】:How to customize error message in swagger when mandatory fields value are not sent in API? 【发布时间】:2019-03-02 05:12:41 【问题描述】:

下面是我的 api.yml:

openapi: 3.0.0
info:
    title: 'AutoDelievery API'
    description: 'AutoDelievery API Documentation'
    termsOfService: 'https://www.yopmail.com'
    contact:
        name: yopmail
        url: 'http://www.yopmail.com'
        email: contactus@yopmail.com
    license:
        name: yopmail
        url: 'http://www.yopmail.com/licenses/yopmail-AutoDelievery-Licence.html'
    version: 1.0.0-oas3
servers:
    -
        url: 'http://localhost:5055/'
tags:
    -
        name: AutoDelievery
        description: 'AutoDelievery product related APIs'
        externalDocs:
            description: 'Documentation:'
            url: 'http://localhost:5055/external/doc'
paths:
    /autoDelievery:
        post:
            tags: [autoDelievery]
            summary: 'Creates a new autoDelievery record'
            operationId: insertSubscription
            requestBody: description: 'autoDelievery request body', content: application/json: schema: $ref: '#/components/schemas/AutoDelievery'
            responses: '200': description: 'successful operation', content: application/json: schema: $ref: '#/components/schemas/AutoDelievery', '400': description: 'Bad Request', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError', '500': description: 'Server Error', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError'
    '/autoDelievery/autoDelieveryID':
        get:
            tags: [AutoDelievery]
            summary: 'AutoDelievery as per ID'
            description: 'Fetches the AutoDelievery for the provided Id'
            operationId: getAutoDelieveryById
            parameters: [in: path, name: autoDelieveryID, required: true, schema: type: string]
            responses: '200': description: 'successful operation', content: application/json: schema: $ref: '#/components/schemas/AutoDelievery', '400': description: 'Server Error', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError'
        delete:
            tags: [autoDelievery]
            summary: 'Delete AutoDelievery as per ID'
            description: 'Finds the autoDelievery for the provided Id and deletes the same'
            operationId: deleteAutoDelieveryById
            parameters: [in: path, name: autoDelieveryID, required: true, schema: type: string]
            responses: '200': description: 'successful operation', content: application/json: schema: $ref: '#/components/schemas/AutoDelievery', '400': description: 'Server Error', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError'
    '/autoDelievery/autoDelieveryID/payment':
        put:
            tags: [AutoDelievery]
            summary: 'Updates autoDelievery payment details'
            parameters: [in: path, name: autoDelieveryID, description: 'AutoDelievery Id of which payment details are to be updated', required: true, schema: type: string]
            operationId: updatePayment
            requestBody: content: application/json: schema: $ref: '#/components/schemas/PaymentMethod'
            responses: '200': description: 'successful operation', content: application/json: schema: $ref: '#/components/schemas/AutoDelievery', '400': description: 'Bad Request', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError', '500': description: 'Server Error', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError'
    '/autoDelievery/autoDelieveryId/frequency':
        put:
            tags: [AutoDelievery]
            summary: 'Updates AutoDelievery frequency, quantity and end data.'
            parameters: [in: path, name: autoDelieveryId, description: 'AutoDelievery Id of which frequency is to be updated', required: true, schema: type: string]
            operationId: updateFrequency
            requestBody: content: application/json: schema: $ref: '#/components/schemas/Frequency'
            responses: '200': description: 'successful operation', content: application/json: schema: $ref: '#/components/schemas/AutoDelievery', '400': description: 'Bad Request', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError', '500': description: 'Server Error', content: application/json: schema: $ref: '#/components/schemas/AutoDelieveryError'
components:
    schemas:
        SubscriptionList:
            type: object
            properties: count: type: integer, result: type: array, items: $ref: '#/components/schemas/AutoDelievery', page: type: integer
        DataEntity:
            type: object
            properties: id: type: string, lastModifiedDate: type: string, createdDate: type: string
        AutoDelievery:
            allOf: [$ref: '#/components/schemas/DataEntity', type: object, required: [userId, clientId, quantity, frequency, payment, product, shippingAddress], properties: userId: type: string, clientId: type: string, parentSubscriptionId: type: string, product: $ref: '#/components/schemas/Product', quantity: type: integer, minimum: 1, frequency: type: number, minimum: 1, payment: $ref: '#/components/schemas/PaymentMethod', paymentMethodId: type: string, shippingMethodId: type: string, nextOrderDate: type: string, subscriptionStartDate: type: string, subscriptionEndDate: type: string, shippingMethod: type: string, shippingAddress: $ref: '#/components/schemas/Address']
        Product:
            type: object
            required: [productId]
            properties: productId: type: string, productDescription: type: string
        PaymentMethod:
            type: object
            required: [billingAddress]
            properties: createdDate: type: string, modifiedDate: type: string, paymentType: type: string, billingAddress: $ref: '#/components/schemas/Address'
            discriminator: propertyName: paymentType
        Frequency:
            type: object
            required: [frequency, quantity]
            properties: frequency: type: number, minimum: 1, subscriptionEndDate: type: string, quantity: type: integer, minimum: 1
        Card:
            allOf: [$ref: '#/components/schemas/PaymentMethod', type: object, required: [nameOnCard, lastFourDigits, expiryMonth, expiryYear], properties: nameOnCard: type: string, lastFourDigits: type: string, token: type: string, expiryMonth: type: string, minLength: 2, maxLength: 2, expiryYear: type: string, format: year, discriminator: propertyName: paymentType]
        PayPal:
            allOf: [$ref: '#/components/schemas/PaymentMethod', type: object, required: [accountId], properties: accountId: type: string]
        Payment:
            type: object
            properties: payment: allOf: [$ref: '#/components/schemas/PaymentMethod'], discriminator: propertyName: paymentType
        Address:
            type: object
            required: [firstName, lastName, addressLine1, city, state, postalCode, country]
            properties: prefix: type: string, firstName: type: string, middleName: type: string, lastName: type: string, suffix: type: string, title: type: string, companyName: type: string, addressLine1: type: string, addressLine2: type: string, city: type: string, state: type: string, postalCode: type: string, country: type: string, phoneNumber: type: string, mobilePhoneNumber: type: string
        Status:
            type: object
            required: [status]
            properties: status: type: string, details: type: string
        Shipping:
            type: object
            properties: shippingMethodId: type: string, shippingMethod: type: string
        PaymentAuthorization:
            type: object
            properties: authId: type: string
        CommerceItem:
            type: object
            required: [subscriptionId, quantity, product]
            properties: subscriptionId: type: string, product: $ref: '#/components/schemas/Product', quantity: type: number, minimum: 1, itemUnitPrice: type: number, itemTotalPrice: type: number, itemDiscount: type: number
        ErrorResponse:
            type: object
            required: [errorMessage]
            properties: field: type: string, errorMessage: type: string
        ErrorResponseList:
            type: object
            required: [errors]
            properties: errors: type: array, items: $ref: '#/components/schemas/ErrorResponse'
        NoSubscriptionResponse:
            allOf: [$ref: '#/components/schemas/ErrorResponseList']
        AutoDelieveryError:
            allOf: [$ref: '#/components/schemas/ErrorResponseList']
        NoOrderResponse:
            allOf: [$ref: '#/components/schemas/ErrorResponseList']

我的示例 api 是:

  "id": "string",
  "lastModifiedDate": "string",
  "createdDate": "string",
  "userId": null,
  "clientId": "string",
  "parentSubscriptionId": "string",
  "product": 
    "productId": "string",
    "productDescription": "string"
  ,
  "quantity": 0,
  "frequency": 0,
  "payment": 
    "createdDate": "string",
    "modifiedDate": "string",
    "paymentType": "string",
    "billingAddress": 
      "prefix": "string",
      "firstName": "string",
      "middleName": "string",
      "lastName": "string",
      "suffix": "string",
      "title": "string",
      "companyName": "string",
      "addressLine1": "string",
      "addressLine2": "string",
      "city": "string",
      "state": "string",
      "postalCode": "string",
      "country": "string",
      "phoneNumber": "string",
      "mobilePhoneNumber": "string"
    
  ,
  "paymentMethodId": "string",
  "shippingMethodId": "string",
  "nextOrderDate": "string",
  "subscriptionStartDate": "string",
  "subscriptionEndDate": "string",
  `enter code here`"shippingMethod": "string",
  "shippingAddress": 
    "prefix": "string",
    "firstName": "string",
    "middleName": "string",
    "lastName": "string",
    "suffix": "string",
    "title": "string",
    "companyName": "string",
    "addressLine1": "string",
    "addressLine2": "string",
    "city": "string",
    "state": "string",
    "postalCode": "string",
    "country": "string",
    "phoneNumber": "string",
    "mobilePhoneNumber": "string"
  

我收到以下格式的错误响应:


    "errors": [
        
            "field": "userId",
            "errorMessage": "must not be null"
        
    ]

我应该怎么做才能有自定义的错误消息?

【问题讨论】:

你解决了吗? 【参考方案1】:

Swagger 在创建 POJO 时将 @NotNull 注释放在 required 字段上。

Message interpolation 可以通过在类路径中创建ValidationMessages.properties 文件来完成,如下所示:

javax.validation.constraints.NotNull.message=CUSTOMIZED ERROR MESSAGE

它将覆盖来自的默认错误消息

/org/hibernate/validator/ValidationMessages.properties

【讨论】:

以上是关于当 API 中未发送必填字段值时,如何在 swagger 中自定义错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

当 API 没有该字段时的 setState

Jira Api对接:提交缺陷

StrongLoop 验证错误和必填字段

如何防止 JAWS 在必填字段上说“无效条目”?

Javascript / Angular2如何根据表单字段值切换按钮

必填字段缺失。 PHP 贝宝 REST API