账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    spring rest mvc 如何通过interceptor postHandle 获取controller 方法的返回值
    89
    0

    比如,controller (RestController)为:

        @RequestMapping( value="/query/races", method = { RequestMethod.POST} )
        @ResponseBody
        public Object queryAll() {
            return raceMapper.selectAll();
        }

    如何在postHandle获取上述方法的 object, 并替换成别的object?

        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                               ModelAndView modelAndView) throws Exception {
    
    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 古城白衣少年殇i 普通会员 1楼

      在Spring MVC中,我们可以使用interceptor来处理请求,并在请求的postHandle方法中获取控制器的方法的返回值。以下是一个简单的示例:

      首先,我们需要在ApplicationComponentMVCComponent中配置interceptor,并设置其target属性为@ControllerAdvice

      ```java @Configuration public class MyConfig {

      @Component
      public class MyInterceptor implements Interceptor {
      
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Object[] args) throws Exception {
              String controllerName = (String) args[0];
              Class<?> controllerClass = Class.forName(controllerName);
      
              Method method = controllerClass.getMethod("handleRequest", args);
              Object result = method.invoke(handler, args);
      
              // 处理返回值
              response.setContentType("application/json");
              response.getWriter().write(result);
          }
      }
      

      } ```

      在上述代码中,我们首先获取了请求的ControllerAdvice对象,并在postHandle方法中获取了控制器的方法的名称和参数。然后,我们获取了方法的返回值类型,这是由于handleRequest方法的参数类型是Object[],它表示多个参数。

      接下来,我们可以通过method.invoke(handler, args)方法来调用控制器的方法。在这个方法中,我们可以通过args数组来获取所有参数,包括请求的参数。

      最后,我们处理返回值,通常将返回值发送到客户端的ResponseWriter对象。在这个示例中,我们将返回值发送到客户端作为JSON数据。

      注意,上述代码中的handleRequest方法是ControllerAdvice方法中的公共方法,我们没有为其提供任何特定的行为。如果你想要在特定的控制器或方法中处理返回值,你需要实现这个方法,并根据需要进行处理。例如,如果你的控制器方法返回一个对象,你可以像这样实现handleRequest方法:

      ```java @ControllerAdvice public class MyControllerAdvice {

      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Object[] args) throws Exception {
          Class<?> controllerClass = Class.forName(controllerName);
      
          Method method = controllerClass.getMethod("handleRequest", args);
          Object result = method.invoke(handler, args);
      
          // 处理返回值
          if (result != null) {
              // 对对象进行处理,例如,将对象转换为JSON格式并发送到客户端
              Object jsonResult = JSONUtils.toObject(result);
              response.setContentType("application/json");
              response.getWriter().write(jsonResult);
          } else {
              // 如果方法返回的是null,处理默认值
              response.setContentType("application/json");
              response.getWriter().write("Default value");
          }
      }
      

      } ```

      在这个示例中,我们在handleRequest方法中检查了返回值的类型。如果是Object类型,我们将其转换为JSON格式并发送到客户端。如果方法返回的是null,我们发送一个默认值,即"Default value"。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部