SpringMVC使用实体类接收前端提交数据,数据类型不匹配报400错误


前言

作为一名刚入行的初级开发,工作中总会遇到各种各样的问题。说一下最近开发中遇到的问题吧。(初级开发往往写增删改查比较多。。。)
项目的整体框架还是spring那一套,前端使用了velocity模板。在使用Form表单提交数据返回列表页的时候出现了400错误,总结一下原因。


一、问题产生原因

form表单如下:

<form id="query_form" action="${rc.contextPath}/newItemTag/list" method="post">
			#parse("pim_new_item_tag/list_query.vm")
</form>
<div class="columnTitle">
		<span class="query_tittle_margin">查询条件</span>
	</div>
	<div >
		<ul class=" input_box clearfix">
            <li style="width:400px;height:40px;">
                <div class="input_box_left">新品标识</div>
                <div class="input_box_right">
                    <select name="status" id="status" class="select">
                        <option value="">请选择</option>
                        <option value="0" #if($!query.status == 0) selected #end>是</option>
                        <option value="3" #if($!query.status == 3) selected #end>否</option>
                    </select>
                </div>
            </li>
            <li style="width:400px;height:40px;">
                <div class="input_box_left">创建时间</div>
                <div class="input_box_right">
                    <input type="text" οnfοcus="WdatePicker({maxDate:'#F{$dp.$D(\'queryFinishOfCreateTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryBeginOfCreateTime" id="queryBeginOfCreateTime" value="$!date.format("yyyy-MM-dd",$!query.queryBeginOfCreateTime)" readonly style="width:100px"/> 至
                    <input type="text" οnfοcus="WdatePicker({minDate:'#F{$dp.$D(\'queryBeginOfCreateTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryFinishOfCreateTime" id="queryFinishOfCreateTime" value="$!date.format("yyyy-MM-dd",$!query.queryFinishOfCreateTime)" readonly style="width:100px"/>
                </div>
            </li>
            <li style="height: 40px;"></li>
            <li style="width:400px;height:80px;">
                <div class="input_box_left">商品ID</div>
                <div class="input_box_right">
                    <textarea id="itemId" style="width: 255px;height: 80px; border: 1px solid #e3e3e3;border-radius: 3px;" name="productIds" value="$!query.productIds" placeholder="最多可查询100个ID,以英文逗号分隔">$!query.productIds</textarea>
                </div>
            </li>
			<li style="width:400px;height:40px;">
                <div class="input_box_left">开始时间</div>
                <div class="input_box_right">
                    <input type="text" οnfοcus="WdatePicker({maxDate:'#F{$dp.$D(\'queryFinishOfStartTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryBeginOfStartTime" id="queryBeginOfStartTime" value="$!date.format("yyyy-MM-dd",$!query.queryBeginOfStartTime)" readonly style="width:100px"/> 至
                    <input type="text" οnfοcus="WdatePicker({minDate:'#F{$dp.$D(\'queryBeginOfStartTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryFinishOfStartTime" id="queryFinishOfStartTime" value="$!date.format("yyyy-MM-dd",$!query.queryFinishOfStartTime)" readonly style="width:100px"/>
                </div>
			</li>
            <li style="height: 40px;"></li>
			<li style="width:400px;height:40px;">
                <div class="input_box_left">结束时间</div>
                <div class="input_box_right">
                    <input type="text" οnfοcus="WdatePicker({maxDate:'#F{$dp.$D(\'queryFinishOfEndTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryBeginOfEndTime" id="queryBeginOfEndTime" value="$!date.format("yyyy-MM-dd",$!query.queryBeginOfEndTime)" readonly style="width:100px"/> 至
                    <input type="text" οnfοcus="WdatePicker({minDate:'#F{$dp.$D(\'queryBeginOfEndTime\')}',dateFmt:'yyyy-MM-dd'});" class="text" name="queryFinishOfEndTime" id="queryFinishOfEndTime" value="$!date.format("yyyy-MM-dd",$!query.queryFinishOfEndTime)" readonly style="width:100px"/>
                </div>
			</li>

			<li style="width:400px;margin-bottom:0;">
				<div class="input_box_left">&nbsp;</div>
				<div class="input_box_right">
					<a id="btn_search" href="javascript:void(0)" class="btn btn_search">查询</a>
					<a id="btn_reset" href="javascript:void(0)"  class="btn btn_reset">重置</a>
				</div>
			</li>
		</ul>
	</div>

接收参数的实体类如下:


```java
public class NewItemTagRequestDto implements Serializable {
    private String  productIds;

    private List<Long> productIdList;

    private Date queryBeginOfStartTime;

    private Date queryFinishOfStartTime;

    private Date queryBeginOfEndTime;

    private Date queryFinishOfEndTime;

    private Date queryBeginOfCreateTime;

    private Date queryFinishOfCreateTime;

    private String status;

问题就出现在数据类型不匹配上,前端form表单使用了日期插件,提交的String类型的日期,后端springmvc使用了实体类接收参数,而实体类中日期参数的数据类型是Date,因此报了一个400错误
在这里插入图片描述

二、解决方法

其实这个问题的解决方式有很多,在不改变表单提交方式的情况下,我列举两种解决方式吧!
1.后端依然使用实体对象接收数据,把实体类中的日期数据类型改成String
实体类修改如下:

public class NewItemTagRequestDto implements Serializable {
    private String  productIds;

    private List<Long> productIdList;

    private String queryBeginOfStartTime;

    private String queryFinishOfStartTime;

    private String queryBeginOfEndTime;

    private String queryFinishOfEndTime;

    private String queryBeginOfCreateTime;

    private String queryFinishOfCreateTime;

    private String status;

Controller接收数据:

@RequestMapping(value = "/list")
    public String list( NewItemTagRequestDto requestDto, Model model){

2.后端使用实体对象+String类型的日期参数接收数据(或者使用HttpServletRequest接收),实体对象不做修改(要注意修改表单中日期对应的input标签中的name属性,与后端接收实体中的日期字段不一致即可)(如果使用实体对象+String类型参数接收数据则不能使用@RequestParam注解)
实体类不做修改:

public class NewItemTagRequestDto implements Serializable {
    private String  productIds;

    private List<Long> productIdList;

    private Date queryBeginOfStartTime;

    private Date queryFinishOfStartTime;

    private Date queryBeginOfEndTime;

    private Date queryFinishOfEndTime;

    private Date queryBeginOfCreateTime;

    private Date queryFinishOfCreateTime;

    private String status;

注意修改form表单中input标签中的name属性(跟实体类中的字段要不一致):
在这里插入图片描述
后端增加String类型的字段接收表单提交的日期数据(或者HttpServletRequest接收),通过DateFomate转化成需要的Date格式再存入到实体类中.:

public String list(HttpServletRequest httpRequest, HttpServletResponse httpResponse, NewItemTagRequestDto requestDto, Model model){
        try{
            String queryBeginOfCreateTime = httpRequest.getParameter("queryBeginOf_CreateTime");
            String queryFinishOfCreateTime = httpRequest.getParameter("queryFinishOf_CreateTime");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值