前端json+@RequestBody的参数接收,不用ViewObject模型接收如何处理

@RequestBody不想使用实体对象封装前端参数,可以通过手动解析json对象并注入到方法的参数中,整个过程对代码无侵入。
摘要由CSDN通过智能技术生成

痛点

@RequestBody接收的参数只能是一个对象,可以通过创建ViewObject对象来接收,但是对于各种不确定参数就需要非常多的ViewObject。
如果不用ViewObject,而是直接用原生Map<String,Object> map接收,一样需要一个个取出来:

    @PostMapping("login")
    public Object login(@RequestBody Map<String,Object> map) {
   
        String account = (String) map.get("account");
        String pwd = (String) map.get("pwd");
        ...
    }

目标方案

最终想要的效果是即使前端传json,后台先解析出来,再塞到方法参数中,这个过程是隐式完成,最终业务代码就可以非常简洁:

    @PostMapping("login")
    public Object login(String account,String pwd) {
   
        String account = (String) map.get("account");
        String pwd = (String) map.get("pwd");
        ...
    }

个别问题Q&A

Q:如何区分POST的json和form形式的参数
A:先判断前端传的是json(通过contentType或者request.getInputStream),确认json后,解析json,然后赋值给方法的参数。同时,可以使用注解来指定(或排除)某些参数使用(或不使用)json对象赋值。


想要实现以上效果, 需要理解springmvc是哪一步获取请求体数据封装成@RequestBody参数对象,
以及其他表单参数是如何赋值,所以:

第一步:理解springmvc参数接收原理

因为springmvc本身是个庞大的架构体系,可以预知它对参数值的封装这个过程是通过某种设计模式完成的,而不是按代码顺序一步步写下来,这是读spring源码的一个方向。

从整个应用服务层面来看,请求体数据先进入tomcat(或其他),被封装形成基础request请求对象,然后经过filter过滤器,经过interceptor拦截器等,进入统一的DispatcherServlet(spring默认servlet),然后在DispatcherServlet中根据HandlerMapping找到匹配的Handler(也就是Controller中某一个方法),最后request请求对象交由匹配的这个Handler处理。

DispatcherServlet

public class DispatcherServlet extends FrameworkServlet {
   
    --1、servlet的doService方法
    @Override
	protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
		
		try {
   
			doDispatch(request, response);
		}
    	....
	}
    
    --2、进入doDispatch方法
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
			try {
   
				HttpServletRequest processedRequest = request;
				
				--3、 为当前request匹配对应的Handler
				HandlerExecutionChain mappedHandler = getHandler(processedRequest);
				if (mappedHandler == null) {
   
					return;
				}

				--4、 拿到HandlerAdapter 适配器
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

				--5、 先经过多个拦截器
				if (!mappedHandler.applyPreHandle(processedRequest, response)) {
   
					return;
				}
				
				--6、 实际调用handle处理(--7、 进入RequestMappingHandlerAdapter.handle()方法)
				ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

				...
				applyDefaultViewName(processedRequest, mv);
				mappedHandler.applyPostHandle(processedRequest, response, mv);
			}
			catch (Exception ex) {
   
				Exception  dispatchException = ex;
			}
			catch (Throwable err) {
   
				// As of 4.3, we're processing Errors thrown from handler methods as well,
				// making them available for @ExceptionHandler methods and other scenarios.
				Exception  dispatchException = new NestedServletException("Handler dispatch failed", err);
			}
			processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
		
	}
	
}

RequestMappingHandlerAdapter

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
		implements BeanFactoryAware, InitializingBean {
   
		@Override

	--
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值