Ask Your Question
1

How can @JsonDeserialize be applied to @RequestParam parameters in Spring Boot?

asked 2023-06-06 08:41:18 +0000

qstack gravatar image

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
0

answered 2023-06-06 09:07:02 +0000

scrum gravatar image

@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));
    }
}
edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account. This space is reserved only for answers. If you would like to engage in a discussion, please instead post a comment under the question or an answer that you would like to discuss

Add Answer


Question Tools

Stats

Asked: 2023-06-06 08:41:18 +0000

Seen: 8 times

Last updated: Jun 06 '23