当前位置:   article > 正文

Spring Boot HandlerMethodArgumentResolver 使用和场景

handlermethodargumentresolver

在 Spring Boot 中,HandlerMethodArgumentResolver 是一个非常有用的接口,它可以帮助我们在处理请求时将请求参数转换为方法参数。这对于简化代码和提高开发效率非常有帮助,特别是在处理复杂的 RESTful API 时。下面是使用方式和多个场景案例。

使用方式

要使用 HandlerMethodArgumentResolver,需要遵循以下步骤:

  1. 创建一个自定义的 HandlerMethodArgumentResolver 实现类。

  2. 在该类中实现 supportsParameter() 方法和 resolveArgument() 方法。

  3. 在 Spring Boot 应用程序中注册该类。

创建自定义的 HandlerMethodArgumentResolver 实现类

为了将 HTTP 请求参数转换为 Java 对象,我们需要创建一个自定义的 HandlerMethodArgumentResolver 实现类。在这个类中,我们需要实现 supportsParameter() 方法和 resolveArgument() 方法。

supportsParameter() 方法

在 supportsParameter() 方法中,我们需要检查方法参数是否与我们要转换的 Java 类型相同。如果是,返回 true,否则返回 false

resolveArgument() 方法

在 resolveArgument() 方法中,我们需要将 HTTP 请求参数转换为 Java 对象。为此,我们可以使用 NativeWebRequest 对象来获取请求参数,然后将其转换为 Java 对象。

注册自定义的 HandlerMethodArgumentResolver 实现类

要在 Spring Boot 应用程序中使用自定义的 HandlerMethodArgumentResolver 实现类,我们需要将其注册到应用程序上下文中。为此,我们可以创建一个 @Configuration 类,并实现 WebMvcConfigurer 接口。在这个类中,我们需要重写 addArgumentResolvers() 方法,并将自定义的 HandlerMethodArgumentResolver 实现类添加到参数解析器列表中。

  1. @Configuration
  2. public class AppConfig implements WebMvcConfigurer {
  3.     @Override
  4.     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
  5.         resolvers.add(new CustomHandlerMethodArgumentResolver());
  6.     }
  7. }

多个场景案例

以下是一些场景案例,演示了如何使用 HandlerMethodArgumentResolver 解析不同类型的请求参数。

将 JSON 请求体转换为 Java 对象

假设有一个 POST 请求,其中包含以下 JSON 请求体:

  1. {
  2.   "name""John",
  3.   "age"30
  4. }

我们可以创建一个自定义的 HandlerMethodArgumentResolver 实现类来将这些参数转换为 Java 对象。

  1. public class JsonHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
  2.     @Override
  3.     public boolean supportsParameter(MethodParameter parameter) {
  4.         return parameter.hasParameterAnnotation(RequestBody.class);
  5.     }
  6.     @Override
  7.     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
  8.         String json = webRequest.getNativeRequest(HttpServletRequest.class).getReader().lines().collect(Collectors.joining(System.lineSeparator()));
  9.         ObjectMapper mapper = new ObjectMapper();
  10.         return mapper.readValue(json, parameter.getParameterType());
  11.     }
  12. }

在这个示例中,我们创建了一个名为 JsonHandlerMethodArgumentResolver 的自定义 HandlerMethodArgumentResolver 实现类,并在其中解析 JSON 请求体。在 supportsParameter() 方法中,我们检查方法参数是否带有 @RequestBody 注解。在 resolveArgument() 方法中,我们从请求体中读取 JSON 数据,并使用 ObjectMapper 将其转换为 Java 对象。

将 XML 请求体转换为 Java 对象

假设有一个 POST 请求,其中包含以下 XML 请求体:

  1. <user>
  2.   <name>John</name>
  3.   <age>30</age>
  4. </user>

我们可以创建一个自定义的 HandlerMethodArgumentResolver 实现类来将这些参数转换为 Java 对象。

  1. public class XmlHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
  2.     @Override
  3.     public boolean supportsParameter(MethodParameter parameter) {
  4.         return parameter.hasParameterAnnotation(RequestBody.class);
  5.     }
  6.     @Override
  7.     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
  8.         String xml = webRequest.getNativeRequest(HttpServletRequest.class).getReader().lines().collect(Collectors.joining(System.lineSeparator()));
  9.         JAXBContext jaxbContext = JAXBContext.newInstance(parameter.getParameterType());
  10.         Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  11.         StringReader reader = new StringReader(xml);
  12.         return unmarshaller.unmarshal(reader);
  13.     }
  14. }

在这个示例中,我们创建了一个名为 XmlHandlerMethodArgumentResolver 的自定义 HandlerMethodArgumentResolver 实现类,并在其中解析 XML 请求体。在 supportsParameter() 方法中,我们检查方法参数是否带有 @RequestBody 注解。在 resolveArgument() 方法中,我们从请求体中读取 XML 数据,并使用 JAXBContext 和 Unmarshaller 将其转换为 Java 对象。

将多个请求参数转换为 Java 对象

假设有一个 GET 请求,其中包含以下请求参数:

  1. name=John&age=30

我们可以创建一个自定义的 HandlerMethodArgumentResolver 实现类来将这些参数转换为 Java 对象。

  1. public class UserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
  2.     @Override
  3.     public boolean supportsParameter(MethodParameter parameter) {
  4.         return parameter.getParameterType().equals(User.class);
  5.     }
  6.     @Override
  7.     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
  8.         String name = webRequest.getParameter("name");
  9.         int age = Integer.parseInt(webRequest.getParameter("age"));
  10.         User user = new User();
  11.         user.setName(name);
  12.         user.setAge(age);
  13.         return user;
  14.     }
  15. }

在这个示例中,我们创建了一个名为 UserHandlerMethodArgumentResolver 的自定义 HandlerMethodArgumentResolver 实现类,并在其中解析多个请求参数。在 supportsParameter() 方法中,我们检查方法参数是否与 User 类型相同。在 resolveArgument() 方法中,我们从请求参数中获取数据,并将其转换为 User 对象。

注册自定义的 HandlerMethodArgumentResolver 实现类

要在 Spring Boot 应用程序中使用自定义的 HandlerMethodArgumentResolver 实现类,我们需要将其注册到应用程序上下文中。为此,我们可以创建一个 @Configuration 类,并实现 WebMvcConfigurer 接口。在这个类中,我们需要重写 addArgumentResolvers() 方法,并将自定义的 HandlerMethodArgumentResolver 实现类添加到参数解析器列表中。

  1. @Configuration
  2. public class AppConfig implements WebMvcConfigurer {
  3.     @Override
  4.     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
  5.         resolvers.add(new JsonHandlerMethodArgumentResolver());
  6.         resolvers.add(new XmlHandlerMethodArgumentResolver());
  7.         resolvers.add(new UserHandlerMethodArgumentResolver());
  8.     }
  9. }

现在,我们已经成功地创建了多个自定义的 HandlerMethodArgumentResolver 实现类,并将它们注册到 Spring Boot 应用程序中。这样,我们就能够轻松地处理不同类型的请求参数,并将它们转换为 Java 对象。

自定义注解来简化参数赋值。

例如,假设您有一个 @UserParam 注解,您可以使用以下代码来解析它:

  1. public class UserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
  2.     @Override
  3.     public boolean supportsParameter(MethodParameter parameter) {
  4.         return parameter.getParameterAnnotation(UserParam.class) != null;
  5.     }
  6.     @Override
  7.     public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
  8.         UserParam userParam = parameter.getParameterAnnotation(UserParam.class);
  9.         String name = webRequest.getParameter(userParam.name());
  10.         int age = Integer.parseInt(webRequest.getParameter(userParam.age()));
  11.         User user = new User();
  12.         user.setName(name);
  13.         user.setAge(age);
  14.         return user;
  15.     }
  16. }

在这个示例中,我们创建了一个 @UserParam 注解,并将其应用于方法参数上。然后,我们可以在 supportsParameter() 方法中检查方法参数是否带有 @UserParam 注解。在 resolveArgument() 方法中,我们从注解中获取参数名,并从请求参数中获取相应的值,然后将其转换为 User 对象。

要在 Spring Boot 应用程序中使用自定义注解,您需要将您的注解类添加到 @Configuration 类中,并将其添加到 addArgumentResolvers() 方法中:

  1. @Configuration
  2. public class AppConfig implements WebMvcConfigurer {
  3.     @Override
  4.     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
  5.         resolvers.add(new UserHandlerMethodArgumentResolver());
  6.     }
  7.     @Retention(RetentionPolicy.RUNTIME)
  8.     @Target(ElementType.PARAMETER)
  9.     public @interface UserParam {
  10.         String name() default "name";
  11.         String age() default "age";
  12.     }
  13. }

现在,您就可以在 Spring Boot 应用程序中使用 @UserParam 注解来简化

原文地址: Spring Boot HandlerMethodArgumentResolver 使用和场景

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/917075
推荐阅读
相关标签
  

闽ICP备14008679号