Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

@JsonDeserialize annotation can be applied to @RequestParam parameters in Spring Boot by creating a custom argument resolver.

Here are the steps:

  1. Create a class that implements the HandlerMethodArgumentResolver interface of Spring

  2. Override the supportsParameter() method to check if the parameter is of type @RequestParam and requires @JsonDeserialize annotation

  3. Override the resolveArgument() method to convert the request parameter to the desired object using ObjectMapper and JsonDeserialize

  4. Annotate the controller method parameter with @JsonDeserialize and the desired class

  5. Add the custom argument resolver to the list of argument resolvers

Here is an example:

public class JsonRequestParamArgumentResolver implements HandlerMethodArgumentResolver {

    private final ObjectMapper objectMapper;

    public JsonRequestParamArgumentResolver(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterAnnotation(RequestParam.class) != null
            && parameter.getParameterAnnotation(JsonDeserialize.class) != null;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, 
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String requestParamValue = webRequest.getParameter(parameter.getParameterName());
        Class<?> targetClass = parameter.getParameterAnnotation(JsonDeserialize.class).as();
        return objectMapper.readValue(requestParamValue, targetClass);
    }
}

In the controller:

@GetMapping("/example")
public ResponseEntity<ExampleResponse> example(@JsonDeserialize(as = ExampleRequest.class) @RequestParam("request") ExampleRequest request) {
     // logic here 
}

To add the custom argument resolver to the list of argument resolvers in Spring:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final ObjectMapper objectMapper;

    public WebConfig(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new JsonRequestParamArgumentResolver(objectMapper));
    }
}