class MvcConfig implements WebMvcConfigurer {

    private final EruptProp eruptProp;

    private final Set<String> gsonMessageConverterPackage = Stream.of(EruptConst.BASE_PACKAGE, Gson.class.getPackage().getName()).collect(Collectors.toSet());

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        Optional.ofNullable(eruptProp.getGsonHttpMessageConvertersPackages()).ifPresent(it -> gsonMessageConverterPackage.addAll(Arrays.asList(it)));
        converters.add(0, new GsonHttpMessageConverter(GsonFactory.getGson()) {
            @Override
            protected boolean supports(Class<?> clazz) {
                for (String pack : gsonMessageConverterPackage) {
                    if (clazz.getName().startsWith(pack)) {
                        return super.supports(clazz);
                    }
                }
                return false;
            }
        });
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {<FILL_FUNCTION_BODY>}

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper helper = new UrlPathHelper();
        helper.setUrlDecode(false);
        helper.setDefaultEncoding(StandardCharsets.UTF_8.name());
        configurer.setUrlPathHelper(helper);
    }

}

        String uploadPath = eruptProp.getUploadPath().endsWith("/") ? eruptProp.getUploadPath() : eruptProp.getUploadPath() + "/";
        ResourceHandlerRegistration resourceHandlerRegistration = registry.addResourceHandler(EruptRestPath.ERUPT_ATTACHMENT + "/**");
        if (uploadPath.startsWith("classpath:")) {
            resourceHandlerRegistration.addResourceLocations(uploadPath);
        } else {
            resourceHandlerRegistration.addResourceLocations("file:" + uploadPath);
        }
    
<no_super_class>