Наше приложение Spring использует Spring Data Rest для многих объектов приложения. Мы испытываем периодические ошибки, когда все запросы к приложению начнут сбой со следующим исключением.
java.lang.IllegalArgumentException: Не удалось разрешить метаданные репозитория для [вставить случайную сущность].
в org.springframework.data.rest.webmvc.config.ResourceMetadataHandlerMethodArgumentResolver.resolveArgument (ResourceMetadataHandlerMethodArgumentResolver.java:97)
в org.springframework.data.rest.webmvc.config.RootResourceInformationHandlerMethodArgumentResolver.resolveArgument (RootResourceInformationHandlerMethodArgumentResolver.java:83)
at org.springframework.data.rest.webmvc.config.RootResourceInformationHandlerMethodArgumentResolver.resolveArgument (RootResourceInformationHandlerMethodArgumentResolver.java:40)
Это нелегко воспроизвести, и сообщение Не удалось разрешить метаданные репозитория для [entity] всегда ссылается на случайную сущность в нашем приложении. Это заставляет меня думать, что это не проблема конфигурации с нашей стороны. Мы используем версию 2.1.3 Spring Boot. Есть предложения по устранению неполадок? Кто-нибудь еще испытывает это?
Для справки: код Spring, генерирующий исключение, выглядит следующим образом:
public ResourceMetadata resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
String lookupPath = this.baseUri.getRepositoryLookupPath(webRequest);
String repositoryKey = UriUtils.findMappingVariable("repository", parameter.getMethod(), lookupPath);
if (!StringUtils.hasText(repositoryKey)) {
return null;
} else {
Iterator var7 = this.repositories.iterator();
ResourceMetadata mapping;
do {
if (!var7.hasNext()) {
throw new IllegalArgumentException(String.format("Could not resolve repository metadata for %s.", repositoryKey));
}
Class<?> domainType = (Class)var7.next();
mapping = this.mappings.getMetadataFor(domainType);
} while(!mapping.getPath().matches(repositoryKey) || !mapping.isExported());
return mapping;
}
}
Я не уверен, что вдруг итератор репозитория внезапно станет пустым.