【问题标题】:Bad request error 400 when submitting a form提交表单时出现错误的请求错误 400
【发布时间】:2017-08-31 10:29:42
【问题描述】:

我在提交表单时收到错误响应 400。我有一个工作正常的表单,然后我添加了一个下拉列表,该列表从 DB 向用户显示性别。下拉菜单正确显示数据,但是当我提交表单时出现错误。这仅在我添加下拉列表时发生。

RegistrationController.java :-

@Controller
public class RegistrationController {
    final static Logger logger = Logger.getLogger(RegistrationController.class);
    private StaffService staffService;

    @Autowired
    private GenderDao genderDao;

    @Autowired
    public RegistrationController(StaffService staffService) {
        this.staffService = staffService;
    }

    @RequestMapping(method = RequestMethod.GET, value = "/register")
    public String registerStaffPage(Model model) {
        List<Gender> genders = genderDao.findAll();
        Iterator<Gender> genderIterators = genders.iterator();
        Map<Gender, String> genderMap = new LinkedHashMap<Gender, String>();
        while (genderIterators.hasNext()) {
            Gender gender = genderIterators.next();
            genderMap.put(gender, gender.getGender());
        }
        model.addAttribute("gendersMap",genderMap);
        model.addAttribute("staffRegistrationBean", new StaffRegistrationBean());
        return "register";
    }

    @RequestMapping(method = RequestMethod.POST, value = "/registerStaff")
    public String registerStaff(@ModelAttribute("staffRegistrationBean") StaffRegistrationBean staffRegistrationBean,
            @Valid StaffRegistrationBean staffRegistrationBeans, Errors errors, Model model) {
        // if (errors.hasErrors())
        // return "register";
        staffService.createStaff(staffRegistrationBean);
        return "RegistrationDone";
    }

    @PostConstruct
    public void init() {
        logger.debug("RegistrationController Bean has been Initialized.");
    }

    @PreDestroy
    public void destroy() {
        logger.debug("RegistrationController Bean has been Destroyed.");
    }
}

StaffRegistrationBean.java

public class StaffRegistrationBean {
private String userName;
    private String password;
    private String firstName;
    private String lastName;
    private String email;
    private String Organization;
    private String phoneNo;
    private Gender gender;
    // getter and setter follows
}

regsiter.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Registration</title>
</head>
<body>
    <h1>Registration Form</h1>
    <form:form id="regForm" modelAttribute="staffRegistrationBean"
        action="registerStaff" method="post">
        <table>
            <tr>
                <td><form:label path="userName" cssErrorClass="error">
                        <spring:message code="userName" /> : 
                    </form:label> <form:input path="userName" name="username" id="username"
                        cssErrorClass="error" /></td>
            </tr>
            <tr>
                <td>Gender: <form:select path="gender">
                        <form:options items="${gendersMap}" />
                    </form:select>
                </td>
            </tr>
            <tr>
                <td><form:label path="organization" cssErrorClass="error">
                        <spring:message code="organizationName" /> : 
                    </form:label> <form:input path="organization" name="username" id="organization"
                        cssErrorClass="error" /></td>
            </tr>
            <tr>
                <td><form:label path="password" cssErrorClass="error">
                        <spring:message code="password" /> : 
                    </form:label> <form:input path="password" name="password" id="password"
                        cssErrorClass="error" /></td>
            </tr>
            <tr>
                <td><form:label path="firstName" cssErrorClass="error">
                        <spring:message code="firstName" /> : 
                    </form:label> <form:input path="firstName" name="firstname" id="firstname"
                        cssErrorClass="error" /></td>
            </tr>
            <tr>
                <td><form:label path="lastName" cssErrorClass="error">
                        <spring:message code="lastName" /> : 
                    </form:label> <form:input path="lastName" name="lastname" id="lastname"
                        cssErrorClass="error" /></td>
            </tr>
            <%-- <tr>
                <td><form:label path="gender">
                        <spring:message code="gender" /> : </form:label>
                <td><form:select path="${gender}">
                        <form:options items="${genderList}" id="id" itemValue="gender">
                        </form:options>
                    </form:select></td>
            </tr> --%>
            <tr>
                <td><form:label path="email" cssErrorClass="error">
                        <spring:message code="email" /> : 
                    </form:label> <form:input path="email" name="email" id="email"
                        cssErrorClass="error" /></td>
            </tr>
            <tr>
                <td><form:label path="phoneNo" cssErrorClass="error">
                        <spring:message code="phoneNo" /> : 
                    </form:label> <form:input path="phoneNo" name="phoneNo" id="phoneNo"
                        cssErrorClass="error" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="register"></td>
            </tr>
        </table>
    </form:form>
</body>
</html>

**

  • 错误:-

**

HTTP 状态 400 - 错误请求

类型状态报告

描述 由于被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由),服务器无法或不会处理请求。

GenderMap 是具有要在屏幕上显示的模型的地图。关键是性别类,值是性别描述。用户将选择一个性别,该性别将引用性别表中的 id。

完整代码可在 -https://github.com/iftekharkhan09/ExpenseCalculator_Nex_Gen/tree/DevBranch 获得

转到 URL - localhost:8080/ExpenseCalculator/register

我们将不胜感激。

【问题讨论】:

  • 我认为 action="registerStaff" 没有指向方法
  • @Ali.Mojtehedy 不。错误的 URL 返回 404,但 OP 得到 400。
  • A Http 400 可能由于错误的请求负载对象而发生。在您的情况下是 Staffregistrationbean。在这个类中,您定义了一个类型为 Gender 的变量性别,但我猜在您的 jsp 中您只需提交一个字符串?

标签: spring jsp spring-mvc jstl


【解决方案1】:

正如 Razmin 所说,spring 正在尝试从 POST 请求的主体(由 HTML 表单自动填充)填充您的 ModelAttribute(类型为 StaffRegistrationBean)。


如果您查看 POST 请求正文,您会看到类似 gender: 1 的内容。 Spring 无法将此 Integer 映射到 Gender(即使此 Integer 仅引用您的 Gender 的 id..)。 您必须从数据库中手动检索 Gender,并将其设置为您的模型。

【讨论】:

    【解决方案2】:

    当 spring 无法从 HTML 表单填充 ModelAttribute 时会发生这种情况。

    staffRegistrationBean ModelAttribute 无法将 Html 的 Gender 属性转换为您的 Gender 对象

    【讨论】:

      【解决方案3】:

      在邮递员中启用“主机”标头时有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 2020-12-18
        • 2016-12-08
        • 2018-02-03
        • 2019-07-17
        • 1970-01-01
        相关资源
        最近更新 更多