Ошибка Springfox «Невозможно найти модель, соответствующую ключу» для {namespace='java.lang', name='ClassConstraintValidatorobject,object '}

Я получаю следующие сообщения об ошибках в журналах:

      [12:15 11:48:20.957] [ERROR][request id: ffdedde3-f147-4fc2-9f9f-ad0c76c1a868][springfox.documentation.swagger2.mappers.ReferenceModelSpecificationToPropertyConverter] - Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='java.lang', name='Class�ConstraintValidator�object,object��'}, viewDiscriminator=com.test.entity.view.View$External, validationGroupDiscriminators=[], isResponse=true}
[12:15 11:48:20.957] [ERROR][request id: ffdedde3-f147-4fc2-9f9f-ad0c76c1a868][springfox.documentation.swagger2.mappers.ReferenceModelSpecificationToPropertyConverter] - Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='java.lang', name='Class�object�'}, viewDiscriminator=com.test.entity.view.View$External, validationGroupDiscriminators=[], isResponse=true}
[12:15 11:48:20.958] [ERROR][request id: ffdedde3-f147-4fc2-9f9f-ad0c76c1a868][springfox.documentation.swagger2.mappers.ReferenceModelSpecificationToPropertyConverter] - Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='java.lang', name='Class�Payload�'}, viewDiscriminator=com.test.entity.view.View$External, validationGroupDiscriminators=[], isResponse=true}
[12:15 11:48:20.991] [ERROR][request id: ffdedde3-f147-4fc2-9f9f-ad0c76c1a868][springfox.documentation.swagger2.mappers.ReferenceModelSpecificationToPropertyConverter] - Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='java.lang', name='Class�ConstraintValidator�object,object��'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}
[12:15 11:48:20.991] [ERROR][request id: ffdedde3-f147-4fc2-9f9f-ad0c76c1a868][springfox.documentation.swagger2.mappers.ReferenceModelSpecificationToPropertyConverter] - Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='java.lang', name='Class�object�'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}
[12:15 11:48:20.992] [ERROR][request id: ffdedde3-f147-4fc2-9f9f-ad0c76c1a868][springfox.documentation.swagger2.mappers.ReferenceModelSpecificationToPropertyConverter] - Unable to find a model that matches key ModelKey{qualifiedModelName=ModelName{namespace='java.lang', name='Class�Payload�'}, viewDiscriminator=null, validationGroupDiscriminators=[], isResponse=true}

Кажется, что пользовательские аннотации проверки каким-то образом задействованы и связанные с ними поля рассматриваются как модели или что-то в этом роде. Пример:

      @Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CardDocumentValidator.class)
@Documented
public @interface CardDocument {
    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class CardDocumentValidator implements ConstraintValidator<CardDocument, TestEntity> {...}

Я использую Spring Boot 2.5.5 с springfox-boot-starter 3.0.0. Однако я все еще использую OpenApi 2.0, поэтому я настроил свойство springfox: documentation: swagger:use-model-v3: false, которое помогло мне избавиться от подобных ошибок.

В api-docs json среди определений:

              "ConstraintDescriptor«object»": {
            "type": "object",
            "properties": {
                "annotation": {
                    "type": "object"
                },
                "attributes": {
                    "type": "object"
                },
                "composingConstraints": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/ConstraintDescriptor«object»"
                    }
                },
                "constraintValidatorClasses": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«ConstraintValidator«object,object»»'}"
                    }
                },
                "groups": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«object»'}"
                    }
                },
                "messageTemplate": {
                    "type": "string"
                },
                "payload": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«Payload»'}"
                    }
                },
                "reportAsSingleViolation": {
                    "type": "boolean"
                },
                "validationAppliesTo": {
                    "type": "string",
                    "enum": [
                        "IMPLICIT",
                        "PARAMETERS",
                        "RETURN_VALUE"
                    ]
                },
                "valueUnwrapping": {
                    "type": "string",
                    "enum": [
                        "DEFAULT",
                        "SKIP",
                        "UNWRAP"
                    ]
                }
            },
            "title": "ConstraintDescriptor«object»"
        },
        "ConstraintDescriptor«object»DefaultView": {
            "type": "object",
            "properties": {
                "annotation": {
                    "type": "object"
                },
                "attributes": {
                    "type": "object"
                },
                "composingConstraints": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/ConstraintDescriptor«object»DefaultView"
                    }
                },
                "constraintValidatorClasses": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«ConstraintValidator«object,object»»'}"
                    }
                },
                "groups": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«object»'}"
                    }
                },
                "messageTemplate": {
                    "type": "string"
                },
                "payload": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«Payload»'}"
                    }
                },
                "reportAsSingleViolation": {
                    "type": "boolean"
                },
                "validationAppliesTo": {
                    "type": "string",
                    "enum": [
                        "IMPLICIT",
                        "PARAMETERS",
                        "RETURN_VALUE"
                    ]
                },
                "valueUnwrapping": {
                    "type": "string",
                    "enum": [
                        "DEFAULT",
                        "SKIP",
                        "UNWRAP"
                    ]
                }
            },
            "title": "ConstraintDescriptor«object»DefaultView"
        },
        "ConstraintDescriptor«object»ExternalView": {
            "type": "object",
            "properties": {
                "annotation": {
                    "type": "object"
                },
                "attributes": {
                    "type": "object"
                },
                "composingConstraints": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/ConstraintDescriptor«object»ExternalView"
                    }
                },
                "constraintValidatorClasses": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«ConstraintValidator«object,object»»'}"
                    }
                },
                "groups": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«object»'}"
                    }
                },
                "messageTemplate": {
                    "type": "string"
                },
                "payload": {
                    "type": "array",
                    "uniqueItems": true,
                    "items": {
                        "$ref": "#/definitions/Error-ModelName{namespace='java.lang', name='Class«Payload»'}"
                    }
                },
                "reportAsSingleViolation": {
                    "type": "boolean"
                },
                "validationAppliesTo": {
                    "type": "string",
                    "enum": [
                        "IMPLICIT",
                        "PARAMETERS",
                        "RETURN_VALUE"
                    ]
                },
                "valueUnwrapping": {
                    "type": "string",
                    "enum": [
                        "DEFAULT",
                        "SKIP",
                        "UNWRAP"
                    ]
                }
            },
            "title": "ConstraintDescriptor«object»ExternalView"
        },
        "ConstraintValidator«object,object»": {
            "type": "object",
            "title": "ConstraintValidator«object,object»"
        },
        "ConstraintValidator«object,object»DefaultView": {
            "type": "object",
            "title": "ConstraintValidator«object,object»DefaultView"
        },
        "ConstraintValidator«object,object»ExternalView": {
            "type": "object",
            "title": "ConstraintValidator«object,object»ExternalView"
        },
        "ConstraintViolation": {
            "type": "object",
            "properties": {
                "constraintDescriptor": {
                    "$ref": "#/definitions/ConstraintDescriptor«object»"
                },
                "executableParameters": {
                    "type": "array",
                    "items": {
                        "type": "object"
                    }
                },
                "executableReturnValue": {
                    "type": "object"
                },
                "invalidValue": {
                    "type": "object"
                },
                "leafBean": {
                    "type": "object"
                },
                "message": {
                    "type": "string"
                },
                "messageTemplate": {
                    "type": "string"
                },
                "propertyPath": {
                    "$ref": "#/definitions/Path"
                },
                "rootBean": {
                    "type": "object"
                }
            },
            "title": "ConstraintViolation"
        },
        "ConstraintViolationDefaultView": {
            "type": "object",
            "properties": {
                "constraintDescriptor": {
                    "$ref": "#/definitions/ConstraintDescriptor«object»DefaultView"
                },
                "executableParameters": {
                    "type": "array",
                    "items": {
                        "type": "object"
                    }
                },
                "executableReturnValue": {
                    "type": "object"
                },
                "invalidValue": {
                    "type": "object"
                },
                "leafBean": {
                    "type": "object"
                },
                "message": {
                    "type": "string"
                },
                "messageTemplate": {
                    "type": "string"
                },
                "propertyPath": {
                    "$ref": "#/definitions/PathDefaultView"
                },
                "rootBean": {
                    "type": "object"
                }
            },
            "title": "ConstraintViolationDefaultView"
        },
        "ConstraintViolationExternalView": {
            "type": "object",
            "properties": {
                "constraintDescriptor": {
                    "$ref": "#/definitions/ConstraintDescriptor«object»ExternalView"
                },
                "executableParameters": {
                    "type": "array",
                    "items": {
                        "type": "object"
                    }
                },
                "executableReturnValue": {
                    "type": "object"
                },
                "invalidValue": {
                    "type": "object"
                },
                "leafBean": {
                    "type": "object"
                },
                "message": {
                    "type": "string"
                },
                "messageTemplate": {
                    "type": "string"
                },
                "propertyPath": {
                    "$ref": "#/definitions/PathExternalView"
                },
                "rootBean": {
                    "type": "object"
                }
            },
            "title": "ConstraintViolationExternalView"
        },

1 ответ

Виновник найден :) private Установить validationErrors в одном из базовых классов сущностей. Таким образом, ConstraintViolation был добавлен в Models и ConstraintDescriptor и его классы полей, которые включали:

      private final List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses;

private final Set<Class<?>> groups;

private final Set<Class<? extends Payload>> payloads;

Установка @JsonIgnore помогла. Другой способ — добавить @ApiModelProperty(hidden = true), который не влияет на сериализацию, просто скрывая поле от документирования.

Другие вопросы по тегам