Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot 2.0 Intercepting the HandlerMethod of a Request

I am midway through upgrading from Spring Boot 1.x to Spring Boot 2.0 and have noticed I have started getting class cast errors in my HandlerInterceptors.

For example, in one HandlerInterceptor I look if the controller method/endpoint is annotated with @AdminOnly to restrict access to certain endpoints.

@Component
public class AdminOnlyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest httpRequest, HttpServletResponse httpResponse, Object handler) {
        HandlerMethod hm = (HandlerMethod) handler;
        Method method = hm.getMethod();
        if (method.getDeclaringClass().isAnnotationPresent(RestController.class) && (method.isAnnotationPresent(AdminOnly.class) || method.getDeclaringClass().isAnnotationPresent(AdminOnly.class))) {
            // Some Logic returning true or false
        }
        return true;
    }
}

This worked in Spring Boot 1.5.x.

After upgrading I now get the following exception:

java.lang.ClassCastException: org.springframework.web.servlet.resource.ResourceHttpRequestHandler cannot be cast to org.springframework.web.method.HandlerMethod

I couldn't find anything relevant in the migration guide. How can I upgrade but keep the interceptor above working?

like image 301
Eduardo Avatar asked Oct 21 '25 14:10

Eduardo


1 Answers

It appears Spring Boot 2.x Interceptors now also process Static Resource requests, so these now need to be manually excluded when registering the interceptor like below:

@Configuration
public class ControllerConfiguration implements WebMvcConfigurer {

    private final AdminOnlyInterceptor adminInterceptor;

    @Autowired
    public ControllerConfiguration(AdminInterceptor adminInterceptor) {
        this.adminInterceptor = adminInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(adminInterceptor)
                .addPathPatterns("/rest-api-root/**"); // White list paths
                //.excludePathPatterns("/static-resource-root/**"); // Black list paths
    }
}
like image 53
Eduardo Avatar answered Oct 23 '25 08:10

Eduardo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!