Не удалось инициализировать прокси - нет сеанса, внутри перехватчика Spring - PullRequest
0 голосов
/ 15 апреля 2019

В моей конфигурации есть перехватчик, и я хочу запретить доступ к ресурсам других пользователей. Внутри WebMvcConfig (реализует WebMvcConfigurer) у меня есть:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new FolderInterceptor(userService, folderService))
            .addPathPatterns(Mapping.FOLDER_MAPPING + "/{id}",
                    Mapping.UPDATE_FOLDER_MAPPING + "/{id}",
                    Mapping.DELETE_FOLDER_MAPPING + "/{id}",
                    Mapping.DOWNLOAD_FOLDER_MAPPING + "/{id}");

}

В моем FolderInterceptor у меня есть метод preHandle для получения доступа к папке и проверки ее владельца:

Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
Long id = Long.valueOf((String) pathVariables.get("id"));

User user = userService.getLoggedAccount();

if (folderService.existsById(id)) {
    Folder folder = folderService.findById(id);

    if (folder.getOwner().getId().equals(user.getId())) {
        return true;
    }
    else {
        response.sendError(403, "Unauthorized");
        return false;
    }
}
else {
    response.sendError(404, "Folder does not exist");
    return false;
}

Если я распечатываю объект папки, у меня появляется та же ошибка в этой строке.

org.hibernate.LazyInitializationException: could not initialize proxy.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Я использовал метод getOne для извлечения моей папки по идентификатору в моем сервисе.Теперь используя folderRepository.findById (id), и пока это работает:

public Folder findById(Long id) {

    Optional<Folder> folder = folderRepository.findById(id);

    if (!folder.isPresent())
        return null;

    return folder.get();
}
0 голосов
/ 15 апреля 2019

Вы извлекаете сущность Folder, скорее всего, без какой-либо зависимости, извлекаемой из одной транзакции здесь:

Folder folder = folderService.findById(id);

Затем, когда вы пытаетесь получить доступ к folder.getOwner(), зависимость владельца не была получена, ипоставщик сохраняемости пытается выполнить отложенную загрузку из базы данных:

if (folder.getOwner().getId().equals(user.getId())) {
    return true;
}

Проблема заключается в том, что folder находится вне области транзакции и является отсоединенной сущностью.

Я бы предложил получить Owner внутри метода folderService.findById(id) или поместите запрос и условное выражение в тот же транзакционный метод.

...