Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

EnableSpringDataWebSupport doesn't seem to work well with WebMvcConfigurerAdapter

I was successfully using @EnableSpringDataWebSupport in my Spring Boot app to enable pagination, sorting and stuff. However, at some point, I had to introduce a custom argument resolver and did it with Java config as follows:

@Configuration 
@EnableSpringDataWebSupport 
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(renamingProcessor());
    }

    @Bean
    protected RenamingProcessor renamingProcessor() {
        return new RenamingProcessor(true);
    } 
}

It made my new argument resolver work, however completely broke paging and other features, that were automatically configured by @EnableSpringDataWebSupport. I've tried switching WebMvcConfigurerAdapter to alternatives like DelegatingWebMvcConfiguration or WebMvcConfigurationSupport, but no luck -- pagination fails with the exception:

Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface

I would appreciate any help or advice how to handle this issue. Similar questions didn't help a lot:

  • The annotation @EnableSpringDataWebSupport does not work with WebMvcConfigurationSupport?
  • Failed to instantiate Pageable bean
  • WebMvcConfigurerAdapter does not work
like image 596
Vladimir Salin Avatar asked Oct 18 '22 16:10

Vladimir Salin


1 Answers

So, after some investigation, I figured out the solution (perhaps, not ideal one, but still working -- I'd still be happy to see the "right" resolution for the problem from Spring professionals). What I changed is switching from extends WebMvcConfigurerAdapter to extends HateoasAwareSpringDataWebConfiguration (since we're using HATEOAS). I also updated the overridden addArgumentResolvers and now my MvcConfig looks like this:

@Configuration
public class MvcConfig extends HateoasAwareSpringDataWebConfiguration {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        super.addArgumentResolvers(argumentResolvers);
        argumentResolvers.add(renamingProcessor());
    }

    @Bean
    protected RenamingProcessor renamingProcessor() {
        return new RenamingProcessor(true);
    }
}

The issue with Pageable disappeared, and custom RenamingProcessor works like a charm.

Hope this answer will help someone who's facing similar issue.

like image 75
Vladimir Salin Avatar answered Oct 30 '22 21:10

Vladimir Salin