问题
对于一些数据,我们从前端获取的都是字符串,那么该如何转换成相对应的格式呢?
比如日期Data、金钱(#,###,###.#)这样的数据格式化。
解决
对于格式化问题,上一个学习笔记中提到,springmvc.xml中添加了<mvc:annotation-driven/>
后是支持@DateTimeFormat
和@NumberFormat
的。从名字上来看,这两个注解就是为了格式化。
在实体类中,对应的格式化成员变量上增加注解,示例如下:
@DateTimeFormat(pattern = "yyyy-mm-dd")
private Date birth;
@NumberFormat(pattern = "#,###,###.#")
private Float salary;
这样,我们就可以按照这样的格式,从字符串格式化成我们所需要的形式。
注意点
(1)如果数据格式化失败,那么失败信息将会存放在BindingResult中,具体参考数据转换那个笔记的图。拿到数据绑定结果,我们可以从中获取一些需要的信息(比如格式化失败),示例代码如下:
@RequestMapping(value = "/emp", method = RequestMethod.POST)
public String save(Employee employee, BindingResult result) {
System.out.println("save :" + employee);
if (result.getErrorCount() > 0) {
System.out.println("出错了!");
for (FieldError error : result.getFieldErrors()) {
System.out.println(error.getField() + ":" + error.getDefaultMessage());
}
}
employeeDao.save(employee);
return "redirect:/emps";
}
在save方法中增加一个入参BindingResult,SpringMVC会帮我们绑定这个参数,我们可以从这个参数中获取错误信息。
(2)我们曾经自己编写了数据转换器,当时它的class是基于org.springframework.context.support.ConversionServiceFactoryBean
的,进行了属性值converters
的设置,把我们的自定义数据转换器放进去。这个class是不支持数据格式化的,因为数据转换和数据格式化是同时进行的,所以使用这个class会造成异常。我们可以更换成org.springframework.format.support.FormattingConversionServiceFactoryBean
。
示例如下:
<!-- 只配置上面,不配置下面,将会造成@RequestMapping不好用 -->
<!-- <mvc:annotation-driven /> -->
<mvc:annotation-driven
conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置 ConversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter" />
</set>
</property>
</bean>
这样,我们既可以配置自定义的数据转换器,也可以进行数据格式化,查看该class,也可以配置自定义的数据格式化器。