客户端发送的请求在语法上是不正确的

时间:2014-10-28 10:08:17

标签: spring jsp validation

我有两个非常相似的使用spring框架的Web函数,函数1命中“客户端发送的请求语法不正确”,而函数2运行良好。我展示了一个不能在下面工作,希望有人可以帮助我。

功能1 JSP:

<form:form id="sform" action="DealMaintEdit.htm" method="POST" commandName="dmForm">
<table border="1">
    <tr><td><spring:message code="label.DealID"/></td>
        <td><form:input path="deal.dealId" readonly="true" size="6"/></td>
    </tr>
    <tr><td><spring:message code="label.Code"/></td>
        <td><form:input path="deal.stkCode"  maxlength="5" size="6"/>
            <form:errors path="deal.stkCode" cssClass="error"/></td>
    </tr>    .....other fields skipped....
</table>
<form:hidden path="mode"/>
<form:hidden path="butt" value="Save"/>
<input form="sform" type="submit" value="<spring:message code="label.Save"/>"/>
</form:form>

功能1 dmForm:

@Component
public class DealMaintForm {
    private String mode;
    private String butt;
    @Valid
    private Deal deal;
.....

功能1控制器:

@RequestMapping(value = "/DealMaintEdit.htm")
public String dealMaintEdit(@ModelAttribute("dmForm") @Valid DealMaintForm form,
     @RequestParam("butt") String butt, BindingResult result, Map model) {

我在控制器中有if(result.hasErrors()),但在遇到错误之前没有执行。

功能1交易:

public class Deal implements Serializable {
    private Long dealId;
    private DealType type;
    @NotNull
    @Min(1)
    @Max(99999)
    private int stkCode;
......

有趣的是,如果存在验证错误,它会在到达控制器方法之前遇到语法上不正确的错误。假设我输入2到stkCode它工作正常,但如果我将stkCode中的@Min(1)更改为@Min(5),则在stkCode中输入2将在语法上不正确。其他领域是相同的。

我的其他网络表单看起来像这样。 功能2 JSP:

<form:form action="StockMaint2Edit.htm" method="POST" commandName="smForm">
<form:hidden path="mode"/>
<form:hidden path="stk.id"/>
    <table border="1">
        <tr>
            <td><spring:message code="label.Code"/></td>
            <td><form:input path="stk.code"/><form:errors path="stk.code" cssClass="error"/></td>
        </tr>
        <tr>
            <td><spring:message code="label.Name"/></td>
            <td><form:input path="stk.name" /><form:errors path="stk.name" cssClass="error"/></td>
        </tr>
    </table>
<form:hidden path="butt" value="Save"/>
<input type="submit" value="<spring:message code="label.Save"/>"/>
</form:form>

功能2 smForm

@Component
public class StockMaintForm2 {
    private String mode;
    private String butt;
    @Valid
    private Stock stk;
.....

功能2控制器

@RequestMapping(value = "/StockMaint2Edit.htm")
public String stockMaintEdit(@ModelAttribute("smForm") @Valid StockMaintForm2 form,
BindingResult result, Map model) {
    if (result.hasErrors()) {
        System.out.println("edit has errors");
        List<FieldError> errList = result.getFieldErrors();
        for (FieldError fe : errList) {
......

功能2股票

public class Stock implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    @NotNull
    @Min(1)
    @Max(99999)
    private int code;
    @NotBlank
    private String name;
....

功能2适用于正确显示的所有验证错误消息。没有语法上不正确的错误。 比较它们几次仍然无法发现问题的区别和原因。如果我应该提供更多信息,请告诉我。

3 个答案:

答案 0 :(得分:0)

我猜这会导致错误,

<form:hidden path="butt" value="Save"/>

您可以尝试使用普通hidden字段作为

<input type="hidden" name="butt" value="Save"/>

Function 1 JSP

您使用了spring:form标记。 butt将无法在请求中明确提供。您需要从model attribute获取它,或者您可以使用html标记简单地输入字段。以便它可以在request

中使用

答案 1 :(得分:0)

感谢您的所有回复。我应该单独回复,但在添加第一条评论后,我无法再添加评论。所以我在这里回复。在你的帮助下,我专注于&#34; butt&#34;。因为它同时是形式和参数,所以我删除@RequestParam并从表单中获取它,然后它就可以了。

@RequestMapping(value = "/DealMaintEdit.htm")
public String dealMaintEdit(@ModelAttribute("dmForm") @Valid DealMaintForm form,
    BindingResult result, Map model) { ......

@SergeBallesta,通过将枪托移动到最后来尝试你的建议,它也有效。如何将您的评论添加为有用的评论?

@RequestMapping(value = "/DealMaintEdit.htm")
public String dealMaintEdit(@ModelAttribute("dmForm") @Valid DealMaintForm form,
    BindingResult result, Map model, @RequestParam("butt") String butt) {   ....

@SanKrish,试过正常的html&#34;隐藏&#34;但它不起作用。此外,由于问题是缺少param而我的@RequestParam是多余的,我用这个

进行了实验
@RequestMapping(value = "/DealMaintEdit.htm")
public String dealMaintEdit(@ModelAttribute("dmForm") @Valid DealMaintForm form,
   @RequestParam("butt2") String butt2, BindingResult result, Map model) {   ....

并在jsp中

<form:form id="sform" action="DealMaintEdit.htm?butt2=abcd" method="POST" commandName="dmForm">

它也不起作用。虽然问题有些解决了,但还有两个问题:

  1. 为什么&#34; butt2&#34;还有语法错误吗?
  2. 如果原始问题是由于缺少参数,为什么只有在出现验证错误时才会发生?

答案 2 :(得分:-1)

我发现你实际上正在合并你对这些方法的注释:

你可以尝试在那里换行:

public class Stock implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;

    @NotNull
    @Min(1)
    @Max(99999)
    private int code;

    @NotBlank
    private String name;
....