错误400-The request sent by the client was syntactically incorrect

出错部分是学习SpringMVC 时学习https://my.oschina.net/gaussik/blog/640164,在添加博客文章部分出现了这个问题。

The request sent by the client was syntactically incorrect 说的意思是:由客户端发送的请求是语法上是不正确的。

上网找了很多资料,大部分都是说前端jsp页面的控件名称(name)和controller中接收的参数名称不一致,检查以后确实存在这个问题,修改以后还是没有解决,这说明别的地方还存在问题。

网上还有一种说法,就是提交表单数据类型与model不匹配,或方法参数顺序错误,这主要是json时会出现这个问题,但我并没有用到json,是直接用类的,所以照着修改了以后还是没有解决。(详见http://cuisuqiang.iteye.com/blog/2054234

再有一种就是form表单中有日期,Spring不知道该如何转换,如要在实体类的日期属性上加@DateTimeFormat(pattern="yyyy-MM-dd")注解,添加以后确实解决了。

public class BlogEntity {
    private int id;
    private String title;
    private UserEntity userByUserId;
    private String context;
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date pubDate;

P.S.在修改这个bug的过程中,真的是学到了。这个部分的前端可以获取值,但到controller时就没有接收到了。

    @RequestMapping(value = "/admin/blogs/addP", method = RequestMethod.POST)
    public String addBlogPost(@ModelAttribute("blog") BlogEntity blogEntity){
        //打印博客标题
        System.out.println(blogEntity.getTitle());
        //打印博客作者
        System.out.println(blogEntity.getUserByUserId().getNickname());
        blogRepository.saveAndFlush(blogEntity);
        return "redirect:/admin/blogs";
    }

这是controller的部分

<form:form action="/admin/blogs/addP" method="post" commandName="blog" role="form">
        <div class="form-group">
            <%--@declare id="title"--%><label for="title">Title:</label>
            <input type="text" name="title" id="title" class="form-control" placeholder="Enter Title:">
        </div>
        <div class="form-group">
                <%--@declare id="userbyuserid.id"--%><label for="userByUserId.id">Author:</label>
                <select class="form-control" id="userByUserId.id" name="userByUserId.id">
                    <c:forEach items="${userList}" var="user">
                        <option value="${user.id}">${user.nickname},${user.firstName} ${user.lastName}</option>
                    </c:forEach>
                </select>
        </div>
        <div class="form-group">
            <%--@declare id="context"--%><label for="context">Content:</label>
            <textarea class="form-control" id="context" name="context" rows="3" placeholder="Please Input Content"></textarea>
        </div>
        <div class="form-group">
            <%--@declare id="pubdate"--%><label for="pubDate">Publish Date:</label>
            <input type="date" class="form-control" id="pubDate" name="pubDate">
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-sm btn-success">提交</button>
        </div>
    </form:form>

这是jsp的部分。

package com.euphe.model;

import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "blog", schema = "blog")
public class BlogEntity {
    private int id;
    private String title;
    private UserEntity userByUserId;
    private String context;
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date pubDate;

    @Id
    @Column(name = "id", nullable = false)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Basic
    @Column(name = "title", nullable = false, length = 100)
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @ManyToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
    public UserEntity getUserByUserId() {
        return userByUserId;
    }

    public void setUserByUserId(UserEntity userByUserId) {
        this.userByUserId = userByUserId;
    }

    @Basic
    @Column(name = "context", nullable = true, length = 255)
    public String getContext() {
        return context;
    }

    public void setContext(String context) {
        this.context = context;
    }

    @Basic
    @Column(name = "pub_date", nullable = false)
    public Date getPubDate() {
        return pubDate;
    }

    public void setPubDate(Date pubDate) {
        this.pubDate = pubDate;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        BlogEntity that = (BlogEntity) o;

        if (id != that.id) return false;
        if (title != null ? !title.equals(that.title) : that.title != null) return false;
        if (context != null ? !context.equals(that.context) : that.context != null) return false;
        if (pubDate != null ? !pubDate.equals(that.pubDate) : that.pubDate != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (title != null ? title.hashCode() : 0);
        result = 31 * result + (context != null ? context.hashCode() : 0);
        result = 31 * result + (pubDate != null ? pubDate.hashCode() : 0);
        return result;
    }

}

这是entity部分,即类的定义

打断点都打在entity上,发现没能接收的值只有pubDate,所以一步一步地往下进行调试,这时因为是嵌套的框架,所以会进入到框架内的代码。不要慌张,慢慢往下走会发现throws exception了,这时可以发现是类型转换出了问题,前端传入的是string,但后端接收的是date类型,其中没办法转换。

其实还有一种方法,可以类似这样(http://www.mkyong.com/spring-mvc/spring-mvc-form-handling-example/)

// save or update user
    // 1. @ModelAttribute bind form value
    // 2. @Validated form validator
    // 3. RedirectAttributes for flash value
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String saveOrUpdateUser(@ModelAttribute("userForm") @Validated User user,
            BindingResult result, Model model,
            final RedirectAttributes redirectAttributes) {

        logger.debug("saveOrUpdateUser() : {}", user);

        if (result.hasErrors()) {
            populateDefaultModel(model);
            return "users/userform";
        } else {

            // Add message to flash scope
            redirectAttributes.addFlashAttribute("css", "success");
            if(user.isNew()){
              redirectAttributes.addFlashAttribute("msg", "User added successfully!");
            }else{
              redirectAttributes.addFlashAttribute("msg", "User updated successfully!");
            }

            userService.saveOrUpdate(user);

            // POST/REDIRECT/GET
            return "redirect:/users/" + user.getId();

            // POST/FORWARD/GET
            // return "user/list";

        }

    }

    // show add user form
    @RequestMapping(value = "/users/add", method = RequestMethod.GET)
    public String showAddUserForm(Model model) {

        logger.debug("showAddUserForm()");

        User user = new User();

        // set default value
        user.setName("mkyong123");
        user.setEmail("[email protected]");
        user.setAddress("abc 88");
        user.setNewsletter(true);
        user.setSex("M");
        user.setFramework(new ArrayList<String>(Arrays.asList("Spring MVC", "GWT")));
        user.setSkill(new ArrayList<String>(Arrays.asList("Spring", "Grails", "Groovy")));
        user.setCountry("SG");
        user.setNumber(2);
        model.addAttribute("userForm", user);

        populateDefaultModel(model);

        return "users/userform";

    }

将一个entity打开,一个一个set,这样可以转换模式。

原文地址:https://www.cnblogs.com/xym4869/p/8494981.html

时间: 2024-10-17 04:30:17

错误400-The request sent by the client was syntactically incorrect的相关文章

解决 spring mvc3.1下post json出现HTTP Status 400 The request sent by the client was syntactically incorrect

问题描述: 已声明 @RequestMapping(value="update", method = RequestMethod.POST)     @ResponseBody     public Map<String, Result> updateNavi(@RequestBody Navigation model) 启动日志有: Mapped "{[/navi/update],methods=[POST],params=[],headers=[],consu

400 Bad Request The request sent by the client was syntactically incorrect ().

项目中一直出现400错误,后面搜索下,发现如下内容. SpringMVC报错信息为The request sent by the client was syntactically incorrect () 在数据绑定的时候一定要主意Controller方法中的参数名和jsp页面里的参数名字是否一致或者按照绑定的规范来写,如果不一致,可能回报如下错误: The request sent by the client was syntactically incorrect (). 从字面上理解是:客户

SpringMVC---400错误The request sent by the client was syntactically incorrect ()

在SpringMVC中使用@RequestBody和@ModelAttribute注解时遇到了很多问题,现记录下来. @ModelAttribute这个注解主要是将客户端请求的参数绑定参数到一个对象上,不用将很多参数@RequestParam或是@PathVariable. 但是在使用过程中遇到了问题, 第一次Html端请求代码如下,请求方式1 // 简单键值对 var data = { productTypeIds : vproducttypeid, channelTypeId : vchan

错误The request sent by the client was syntactically incorrect的解决

问题:错误400-The request sent by the client was syntactically incorrect. springMVC中,某个页面提交时报400错误,如下图. 解决方法: 1.在网上找了一下,答案是通常遇到这个错误是因为前端jsp页面的控件名称和controller中接收的参数名称不一致.但仔细对比了一遍发现没有问题.很郁闷. 2.然后就反复的提交那个页面进行测试,发现了问题,因为我是将多个参数作为一个实体传至controller,发现某个文本框为空时,提交

解决SpringMVC入参出现The request sent by the client was syntactically incorrect请求语法错误方法

使用SpringMVC出现The request sent by the client was syntactically incorrect.请求错误如下: 可以确定为提交的表单数据和目标方法的入参不一致所导致,表单数据可以多于目标入参个数,但目标参数没有被赋值,则会出现该异常,如下情况: 表单数据: 目标方法: Employee字段: 比对表单数据和Employee字段,可以发现,表单数据比Employee字段少,再加上目标方法的入参是一个 Employee对象,所以将会出现提交的数据不足,

The request sent by the client was syntactically incorrect. 400 问题

The request sent by the client was syntactically incorrect. 这个问题是因为 SpringMvc controller 里面的方法参数和请求参数不匹配. 请求参数在 Contoller 的方法参数对象中不存在则会报这个错误. 如 : Controller 里面的方法 @RequestMapping(value = "/login/signin", method = RequestMethod.POST) public @Resp

又见The request sent by the client was syntactically incorrect ()

前几天遇到过这个问题(Ref:http://www.cnblogs.com/xiandedanteng/p/4168609.html),问题在页面的组件name和和注解的@param名匹配不对,这个好解决,一一对好就行了. 但是,这回情况不一样了,我的页面控件是类似这样的: <p style="height:280px;display:block;"> <span class="req"> <label><input typ

(SpringMVC)报错:The request sent by the client was syntactically incorrect ()

springMVC数据绑定,对我们而言,能够更轻松的获取页面的数据,但是必须要注意的一点就是: Controller方法中的参数名和jsp页面里的参数名字是否一致或者按照绑定的规范来写 在Controller中@RequestParam("m_level") Integer m_level 那么在jsp页面上的数据 <select name="m_level"> <option value="一级">一级</opti

POST 400 Bad Request The request sent by the client was syntactically incorrect

最近在做Web开发的时候,使用$.post提交数据,但是回调函数却没有被触发,按F12看控制台输出是:POST *** 400 Bad Request 后台是SpringMVC的,设置了断点也不会被触发. 后来查看JQuery资料了解到,$.post提交数据只有成功时才触发回调函数,于是改用$.ajax提交数据,添加error回调函数,得到错误信息了,如下图: 这个问题是什么原因造成的呢? 后来经过测试发现,是表单提交的内容数据类型与实体的(也就是数据表字段)的数据类型不匹配导致的. 在提交表单