LINUX.ORG.RU

Помогите разобраться с ошибкой

 , ,


0

1

Проект на SpringBoot 1.5.8, шаблоны Jade templates.

Добавляю загрузку/скачивание файлов.

Отдаю файл вот таким методом:

    @GetMapping(value = "/{fileId:[\\d]+}", produces = APPLICATION_OCTET_STREAM_VALUE)
    @ExceptionHandler(value = FileNotFoundException.class)
    public @ResponseBody
    HttpEntity<byte[]> getFileById(@PathVariable Long fileId, final HttpServletResponse response) throws IOException {
        Assert.notNull(fileId);
        StoredFile file = this.storageService.getFileById(fileId);
        if (file == null) {
            response.sendError(404, String.format("File %s not found", fileId));
            return null;
        }
        byte[] content;
        try {
            content = this.storageService.getFileContent(file.getPath());
        } catch (IOException e) {
            e.printStackTrace();
            if (this.userService.currentUser().isAdmin()) {
                response.sendError(404, String.format("File %s (%s) not found", file.getName(), file.getPath()));
            } else {
                response.sendError(404, String.format("File %s not found", file.getName()));
            }
            return null;
        }

        HttpHeaders header = new HttpHeaders();
        header.setContentType(APPLICATION_OCTET_STREAM);
        header.set("Content-Disposition", "inline; filename=" + file.getName());
        header.setContentLength(file.getSize());

        return new HttpEntity<byte[]>(content, header);
    }

Когда дергаю файл, он успешно отдается в браузер, но в логе имею портянку ошибок.

Прикладываю еще WebConfig на случай, т.к. ошибка из него произрастает.

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Qualifier("viewHelper")
    @Autowired
    private ViewHelper viewHelper;

    @Autowired
    private Environment env;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/webjars/**")
                .addResourceLocations("/webjars/");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(viewObjectAddingInterceptor());
        super.addInterceptors(registry);
    }

    @PostConstruct
    public void registerJadeViewHelpers(){
        viewHelper.setApplicationEnv(this.getApplicationEnv());
    }

    @Bean
    public HandlerInterceptor viewObjectAddingInterceptor() {
        return new HandlerInterceptorAdapter() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                viewHelper.setStartTime(System.currentTimeMillis());

                return true;
            }

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView view) {
                CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
                if (token != null) {
                    view.addObject(token.getParameterName(), token); // ВОТ ТУТ ОШИБКА НАЧИНАЕТСЯ
                }
            }
        };
    }

    public String getApplicationEnv(){
        return this.env.acceptsProfiles(ENV_PRODUCTION) ? ENV_PRODUCTION : ENV_DEVELOPMENT;
    }
}

Стек эксепшенов тут: https://pastebin.com/HcraFKTT

PS. мой вопрос в сабже

★★★★★
java.lang.NullPointerException: null
    at com.raysmond.blog.WebConfig$1.postHandle(WebConfig.java:67)

Смотри на 67-ю строчку WebConfig.java и думай, что там может быть null (или не думай, а подключи дебаггер и посмотри) После этого думай, откуда этот null взялся. Судя по твоему коду у тебя view null, что в целом и логично. Видимо тебе надо добавить в условие строчкой выше && view != null

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Спасибо, обернул в проверку

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView view) {
                if (view != null) {
                    CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
                    if (token != null) {
                        view.addObject(token.getParameterName(), token);
                    }
                }
            }

Похоже, что когда идет отдача файла, там этот view не инициализирован, что вполне логично.

bvn13 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.