我有两个非常相似的使用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适用于正确显示的所有验证错误消息。没有语法上不正确的错误。 比较它们几次仍然无法发现问题的区别和原因。如果我应该提供更多信息,请告诉我。
答案 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">
它也不起作用。虽然问题有些解决了,但还有两个问题:
答案 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;
....