Spring表单字段dataType转换,错误

时间:2014-11-20 09:48:43

标签: spring

这是Achinta,是Spring世界的新蜜蜂。我需要一点帮助来理解和解决我面临的问题。我希望能在这里找到答案。

我正在开发一个示例Spring Web项目。这里我有一个Controller,Bean类和一个用于UI和其他工件的Jsp页面。这是我的Bean课程。

@Entity
@Table(name = "tblLoadCriteria")
public class Load implements Serializable {
    private Integer loadID;
    private String loadCountry;
    private String loadState;
    private String loadCity;
    private Integer totalAirVolume;

    public Load() {//Constructor}

   //And Getter & Setter methods for loadID, loadCountry, loadState, loadCity & totalAirVolume
}

我的Jsp页面中的Spring表单。

<form:form id="systemForm" commandName="load" action="${pageContext.request.contextPath}/doSothing" method="POST" >
  <spring:message code="loadCountry" />: <form:input path="loadCountry" />
  <spring:message code="loadState" />: <form:input path="loadState" />
  <spring:message code="loadCity" />: <form:input path="loadCity" />
  <spring:message code="totalAirVolume" />: <form:input path="totalAirVolume" />

  <spring:message code="save" text="Save" scope="page" var="save" />
  <input id="next" type="button" onClick="submitSave();" />
</form:form>

这里是控制器代码

@RequestMapping(value = "/doSothing", method = RequestMethod.POST)
public String doSothing(HttpServletRequest request, HttpServletResponse response, @ModelAttribute("load") @Valid Load load ,
            BindingResult result, SessionStatus sessionStatus) {

    loadService.saveLoad(load);

    return "forward:getApplicationRequirements";
}

我面临的问题是,&#34; totalAirVolume&#34;在Load bean类中,它是Integer类型,并使用spring form标签绑定到UI页面。但是在UI中,如果我输入浮点值(F.Ex 12.12),而不是整数并提交页面,它会给我状态:400错误。

我不太热衷于javascript验证&#34; totalAirVolume&#34;字段和寻找Spring方式来处理它。请帮忙。

我们非常感谢您的回复。

此致 Achinta

2 个答案:

答案 0 :(得分:0)

如果出现验证/转换错误,请像这样修改您的控制器以返回到表单:

@RequestMapping(value = "/doSothing", method = RequestMethod.POST)
public String doSothing(HttpServletRequest request, HttpServletResponse response, @ModelAttribute("load") @Valid Load load ,
            BindingResult result, SessionStatus sessionStatus) {
    // Return back to the form if the data is not valid
    if (bindingResult.hasErrors()) {
        return "yourFormViewName"; // Name of the view for your form
    }
    loadService.saveLoad(load);
    return "forward:getApplicationRequirements";
}

将它放在JSP表单中:

<form:errors>元素将显示服务器端验证/转换错误消息。

答案 1 :(得分:0)

首先,在将任何内容保存到数据库之前,最好检查每个字段是否有效。我看到你在模型对象'Load'之前添加@Valid,这意味着你想使用JSR-303来验证bean对象。但是,在bean类中,不添加注释来检查任何内容,例如@size。 检查此http://docs.spring.io/spring/docs/3.2.7.RELEASE/spring-framework-reference/htmlsingle/#validation-beanvalidation-overview,“7.8.1 JSR-303 Bean验证API概述”。

我建议您创建一个实现'org.springframework.validation.Validator'的验证器,而不是使用JSR-303 API,并制定规则。

在控制器中,在保存对象之前,请调用此验证程序以验证对象。如果有错误,请返回错误消息以强制输入正确的内容。

@RequestMapping(value =“/ doSothing”,method = RequestMethod.POST) public String doSothing(HttpServletRequest请求,HttpServletResponse响应,

LoadValidator lv=new LoadValidator ();
@ModelAttribute("load") @Valid Load load ,
            BindingResult result, SessionStatus sessionStatus) {

    LoadValidator.validate(load);
    if(result.hasErrors()){
       //do something
        return something;
    }else {
        loadService.saveLoad(load);
        return "forward:getApplicationRequirements";
   }
}

供您参考,请查看上述链接的“7.2使用Spring的Validator接口进行验证”。