类型转换与格式化(转化错误会报400异常)
对页面上表单传来的数据进行转换 :比如表单上有一个日期 必须输入格式为yyyy-MM-dd才能将数据绑定到controller的参数上
//实体类 book 中的时间字段 private Integer bookId; //表单输入字符串可以自动完成类型的转化并且给此属性赋值 private String name; //表单输入字符串可以自动完成类型的转化并且给此属性赋值 private int price; //表单输入 2017-10-24 这种格式的才可以完成数据的绑定 否则会报400的异常 @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date createTimeStartQuery; @NumberFormat(pattern="#,###,###.#") private double salary;
//book 和 bindingResult之间不能有别的入参声明 @RequestMapping("aaa") public String listFeedback(Book book,BindingResult result) { //如果不进行BindingResult bindingResult判断会报400异常 if (result.hasErrors()) { //数据绑定错误,做处理 return "from"; //可以重新跳回到表单页面在表单页面显示错误信息 或者 抛出自定义的异常 } } //若是调到表单页面显示错误消息,需要用到spring的form表单指定属性 并且显示的消息为英文的 不是我们想要的消息,还需要通过国际化进行错误消息的定制,一般推荐抛出自定义的异常
利用国际化资源文件定制错误消息
一 :<!-- 获取资源文件的配置(atguigu.properties)配置ResourceBundleMessageSource这个Bean ,id必须是 messageSource --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="atguigu" /> </bean> 二 :国际化资源文件 atguigu.properties 中内容 typeMismatch.book.bookId=输入错误,请输入数字 三 :显示错误消息 应你该用spring的form表单 <form:form action="${pageContext.request.contextPath }/saveBook" method="post" modelAttribute="book"> ID:<form:input path="bookId"/> <form:errors path="bookId"/> 书名:<input type="text" name="bookName"/><br/> 价格:<input type="text" name="price"/><br/> 出版日期:<input type="text" name="publishDate"/><br/> <input type="submit" value="保存"/> </form:form>自定义类型转化器(例子)
/** 源类型:页面提交的String类型的数据:"河北,石家庄,石家庄大街 * 转化为目标类型:Address */ public class Address { private String province; private String city; private String street; }
一:自定义类型转化器,需要实现Converter<S,T>这个接口 public class AddressConverter implements Converter<String, Address>{ public Address convert(String source) { Address address = null; if(source != null && source.length() > 0) { //河北,石家庄,石家庄大街 String[] split = source.split(","); if(split.length == 3 ) { String province = split[0]; String city = split[1]; String street = split[2]; address = new Address(province, city, street); } } return address; } } 二:注册自定义转化器 <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.atguigu.convert.converter.AddressConverter"/> </set> </property> </bean> <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"/> conversion-service值是上面配置的bean的id 三:使用 <form action="${pageContext.request.contextPath }/saveAddress" method="post"> <!-- name属性是根据类型的首字母小写匹配的 --> <input type="text" name="address"/> <input type="submit" value="保存地址"/> </form> @RequestMapping("/saveAddress") public String saveAddress(Address address) { System.out.println(address); return "success"; }