使用SpringMVC访问Controller接口返回400BadRequest

目录
  • 访问Controller返回400BadRequest
    • 问题
    • HTMLform标签的enctype属性
  • SpringMVC遇到的Http400BadRequest总结
    • 下面来总结下

访问Controller返回400BadRequest

问题

SpringMVC使用自定义类型接收参数时, form提交会返回400 Bad Request,controller接口里的方法没有得到调用。

@RequestMapping(value = "/list.do", method = {RequestMethod.GET , RequestMethod.POST})
    public String list(Order param, HttpServletRequest request) {
        logger.info(JSONObject.fromObject(param).toString());
        Integer count = orderService.findCount(param);
        logger.info(count);
        param.setRows(count);
        List<Order> result = orderService.findByPage(param);
        logger.info(JSONArray.fromObject(result).toString());
        request.setAttribute("param", param);
        request.setAttribute("result", result);
        return "order/list";
    }
    <form action="<%=basePath%>order/list.do" id="myform" method="post" >
        <input type="hidden" name="currentPage" value="${param.currentPage}"/>
        <table>
            <tr>
                <td width="80" align="right">订单状态: </td>
                <td>
                    <select name="order_status" autoWidth="true" style="width:120px;">
                        <option value="">全部</option>
                        <c:forEach items="${order_status_map}" var="temp">
                            <option value="${temp.key}" <c:if test="${temp.key == param.order_status}">selected="selected"</c:if>>${temp.value}</option>
                        </c:forEach>
                    </select>
                </td>
                <td align="right">订单号: </td>
                <td>
                    <input type="text" name="order_no" id="order_no" onfocus="this.value=''" value="${param.order_no}" style="width:140px;"/>
                </td>
            </tr>
            <tr>
                <td width="80" align="right">创建时间: </td>
                <td><input type="text" class="date" name="createTimeStart" value="${param.createTimeStart}" style="width:120px;"/></td>
                <td align="center">&nbsp;至&nbsp;</td>
                <td><input type="text" class="date" name="createTimeEnd"  value="${param.createTimeEnd}" style="width:120px;"/></td>
                <td><button><span class="icon_find">查询</span></button></td>
                <td><button onclick="add();return false;"><span class="icon_add">添加</span></button></td>
            </tr>
        </table>
    </form>

直接在浏览器地址栏输入<%=basePath%>order/list.do是可以访问的并查询出数据的,我一开始以为是get方法能访问,post不能访问,后来发现,get使用Context-Type为application/x-www-form-urlencoded时也会访问不了,post使用使用application/json也能访问。

所以,这就需要修改form里的enctype属性为application/json,但是enctype属性只支持下面表格三种,

HTML form 标签的 enctype 属性

描述
application/x-www-form-urlencoded 在发送前编码所有字符(默认)
multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain 空格转换为 “+” 加号,但不对特殊字符编码。

我试了下,text/plain和application/json具有同样的效果。

虽然在form里加上enctype=”text/plain”可以解决接口返回400BadRequest的问题,但是有新的问题出现:接口的参数Order param接受不到post提交的值,但是将参数直接拼接在url,Order param则可以接收到值,Order param

SpringMVC遇到的Http400BadRequest总结

在搭建SpringMVC环境,在使用中遇到了多次Bad Request的连接

下面来总结下

1.参数类型不对,如后台实体类的属性为int,但传来的参数为字符串

2.因为我的粗心,本来是要通过Ajax获得一个json串,但是后台的方法在返回值类型前没有加@RequestBody注解

3.传递的参数为日期,spring不知道该以什么格式转换为Date类型,解决办法为在实体类的日期属性上加上@DateTimeFormat(pattern="yyyy-MM-dd")注解即可

4.刚遇到的问题,排查了好久终于知道是什么原因了,实体类中有int类型的属性,但是前台传参时传递的样子是这样的"age=",并没有给一个准确的数字(age=18),所以导致Spring在对int型属性进行赋值时无法正确赋值

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决SpringMVC使用@RequestBody注解报400错误的问题

    一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的 首先要注意 封装的对象中的字段类型有没有Date类型或者int等类型的,如果有的话,在set方法中统一将传入的参数要调整为String类型 在set方法中进行参数的转换 比如有一个Date类型的字段 private Date startTime; public Date getStartTime() { return startTime; } public void setStartTime(

  • Spring MVC Controller返回值及异常的统一处理方法

    旧的设计方案 开发api的时候,需要先定义好接口的数据响应结果.如下是一个很简单直接的Controller实现方法及响应结果定义. @RestController @RequestMapping("/users") public class UserController { @Inject private UserService userService; @GetRequest("/{userId:\\d+}") public ResponseBean signin

  • Spring MVC参数校验详解(关于`@RequestBody`返回`400`)

    前言 工作中发现一个定律,如果总是习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好我的业务代码,返回正确的结果即可.直到遇到了400. spring返回400的时候通常没有任何错误提示,当然也通常是参数不匹配.这在参数少的情况下还可以一眼看穿,但当参数很大是,排除参数也很麻烦,更何况,既然错误了,为什么指出来原因呢.好吧,springmvc把这个权力交给了用户自己.话不多说了,来一起看看详细的介绍吧. springmvc

  • 使用SpringMVC访问Controller接口返回400BadRequest

    目录 访问Controller返回400BadRequest 问题 HTMLform标签的enctype属性 SpringMVC遇到的Http400BadRequest总结 下面来总结下 访问Controller返回400BadRequest 问题 SpringMVC使用自定义类型接收参数时, form提交会返回400 Bad Request,controller接口里的方法没有得到调用. @RequestMapping(value = "/list.do", method = {Re

  • springMVC利用FastJson接口返回json数据相关配置详解

    一直使用的是FastJson,感觉还不错,很方便.看了一段别人的分析,觉得很有道理. 为什么要使用Fastjson,其实原因不需要太多,喜欢就行. 我之所以要替换掉Jackson最主要的原因是Jackson在处理对象之前的循环嵌套关系时不便. ps:什么是对象间的循环嵌套?比如A有一个List,B对象里又有一个A对象,当然返回A对象的Json字符串时,如果是 Jackson就会发生异常,因为Jackson天生不具备处理这种关系的能力,而Fastjson正好具备了这种能力(另,如果你用的是 Jac

  • SpringMVC项目访问controller时候报404的解决

    目录 SpringMVC访问controller时候报404 在网上搜各种方法都没有解决 终于解决 SpringMVC 无法访问到controller的可能原因 从网上查的资料 SpringMVC访问controller时候报404 自己写的SpringMVC项目,突然发现访问controller路径的时候页面显示404,看控制台也没有报严重错误,只是说该路径找不到,并且单独访问jsp也能正常访问. 控制台报这种错误 No mapping found for HTTP request with

  • Springmvc Controller接口代码示例

    Spring MVC Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 收集.验证请求参数并绑定到命令对象: 将命令对象交给业务对象,由业务对象处理并返回模型数据: 返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名). 1. 继承该接口 Controller接口,重写对应方法,或者采用注解Controller,自定义映射文件 @Controller @RequestMapping("/flight&q

  • SpringMVC编程使用Controller接口实现控制器实例代码

    Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: 2.将命令对象交给业务对象,由业务对象处理并返回模型数据: 3.返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名). DispatcherServlet,主要负责整体的控制流程的调度部分: 1.负责将请求委托给控制器进行处理: 2.根据控制器返回的逻辑视图名选择具体的视图进行渲染(并把

  • SpringMVC中controller返回json数据的方法

    本文实例为大家分享了SpringMVC中controller返回json数据的2种方法,供大家参考,具体内容如下 1.jsp的ajax请求: function getJson(){ $.ajax({ type:"get", dataType:"json", url:"<%=basePath %>getJson", success:function(data){ for(var i=0;i<jsonData.length;i++)

  • SpringMVC实现Controller的三种方式总结

    目录 实现Controller的三种方式 1.实现Controller接口 2.实现HttpRequestHandler接口 3.全注解 关于SpringMVC的控制器(Controller) 控制器Controller 实现Controller的三种方式 1.实现Controller接口 实现Controller接口,重写handleRequest方法,ModelAndView对象是一个模型视图对象,既可以添加数据,又可以保存页面信息,并且处理请求的方式是转发.这个对象要拆成两部分来看 mod

  • 如何在springMVC的controller中获取request

    这篇文章主要介绍了如何在springMVC的controller中获取request,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getReque

  • SpringMVC中Controller类数据响应的方法

    目录 1. 方法返回值类型 2. 页面跳转 2.1 直接返回字符串 2.2 返回 ModelAndView 对象 2.3 视图前缀和后缀 2.3 重定向和转发 3. 回写数据 3.1 直接返回字符串 3.2 返回对象或集合 上篇博客我们了解了请求参数的获取,那么获取到请求参数之后,需要对参数进行出来,然后进行数据响应.那么这篇博客我们就来了解 Controller 类如何进行数据响应. 1. 方法返回值类型 在 web 阶段我们也了解过数据响应,我们可以简单的将数据响应分为:页面跳转和回写数据

  • 使用springmvc的controller层获取到请求的数据方式

    目录 content-type 1.application/x-www-form-urlencoded 1.1 String 参数值=reqeust.getParameter("参数名"); 1.2 Map<String,String[]> paramMap=request.getParameterMap(); 2.multipart/form-data 3.text/xml 4.application/json 4.1 页面请求的数据获取 4.1.1 页面js请求如下 4

随机推荐