类型转换与格式化(转化错误会报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";
}