DwpEligibilityRequestResolver.java

package uk.gov.dhsc.htbhf.dwp.controller;

import lombok.AllArgsConstructor;
import org.springframework.core.MethodParameter;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import uk.gov.dhsc.htbhf.dwp.converter.RequestHeaderToDWPEligibilityRequestConverter;
import uk.gov.dhsc.htbhf.dwp.model.DWPEligibilityRequest;

import javax.annotation.Nonnull;

@AllArgsConstructor
public class DwpEligibilityRequestResolver implements HandlerMethodArgumentResolver {

    private RequestHeaderToDWPEligibilityRequestConverter converter;

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(DWPEligibilityRequest.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, @Nonnull WebDataBinderFactory binderFactory) throws Exception {
        DWPEligibilityRequest request = converter.convert(webRequest);
        validateRequest(parameter, webRequest, binderFactory, request);
        return request;
    }

    @SuppressWarnings("PMD.SignatureDeclareThrowsException")
    private void validateRequest(MethodParameter parameter, NativeWebRequest webRequest, WebDataBinderFactory binderFactory,
                                 DWPEligibilityRequest request) throws Exception {
        WebDataBinder binder = binderFactory.createBinder(webRequest, request, "request");
        binder.validate();
        BindingResult bindingResult = binder.getBindingResult();
        if (bindingResult.getErrorCount() > 0) {
            throw new MethodArgumentNotValidException(parameter, bindingResult);
        }
    }
}