引言
由于Spring MVC自带的@NumberFormat和@DateTimeFormat格式化不能很好的支持国际化,在《java国际化之---springMVC+Freemaker demo(三)》http://moon-walker.iteye.com/blog/2379940的demo中我们实现了自定的formatter:MyDateFormatter、MyCurrencyFormatter分别支持国际化的日期、货币处理。但有个弊端,表单对象中所有的Date、BigDecimal类型都会进行相同规则的转换,不能像Spring MVC自带的@NumberFormat和@DateTimeFormat对指定属性添加注解,只对指定对象进行转换。
庆幸的是Spring MVC支持我们对自定义的Formatter添加自己的注解。下面我们进行详细讲解,并附上demo代码,详见文章末尾Github地址。
自定义的Formatter注解
要实现自定义的Formatter注解,其实可以参考Spring MVC自带的@NumberFormat实现方法,这里我们以上一篇demo中实现的MyDateFormatter为例,进行讲解。
创建过程分为三步:
第一步:首先我们看下@DateTimeFormat注解在Spring MVC中的实现,并模拟创建自己的@MyDateFormat注解,内容如下:
/** * Created by gantianxing on 2017/6/17. */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) public @interface MyDateFormat { }
第二步:仿照Spring MVC中的DateTimeFormatAnnotationFormatterFactory创建自己AnnotationFormatterFactory实现类MyDateFormatAnnotationFormatterFactory,内容如下:
/** * Created by gantianxing on 2017/6/17. */ public class MyDateFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<MyDateFormat> { private static final Set<Class<?>> FIELD_TYPES; static { Set<Class<?>> fieldTypes = new HashSet<Class<?>>(4); fieldTypes.add(Date.class);//这里只处理Date类型 FIELD_TYPES = Collections.unmodifiableSet(fieldTypes); } @Override public Set<Class<?>> getFieldTypes() { return FIELD_TYPES;//返回支持的类型列表 } @Override public Printer<?> getPrinter(MyDateFormat myDateFormat, Class<?> aClass) { return getFormatter(myDateFormat, aClass); } @Override public Parser<?> getParser(MyDateFormat myDateFormat, Class<?> aClass) { return getFormatter(myDateFormat, aClass); } protected Formatter<Date> getFormatter(MyDateFormat annotation, Class<?> fieldType) { MyDateFormatter formatter = new MyDateFormatter(); return formatter; } }
第三步:将自定义的MyDateFormatAnnotationFormatterFactory注入到spring mvc,在spring-mvc.xml中的配置代码如下:
<!-- formatter转换配置 --> <bean id="formatService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <!-- 采用自定义的AnnotationFormatterFactory注入,可以使用注解 --> <bean class="com.sky.locale.demo.formatter.factory.MyDateFormatAnnotationFormatterFactory" /> <!-- 直接注入自定义Formatter无法使用注解 --> <bean class="com.sky.locale.demo.formatter.MyCurrencyFormatter" /> </set> </property> </bean>
为了对比,这里MyCurrencyFormatter没有采用自定义注解方式实现,感觉兴趣的朋友可以参照上述三个步骤自己实现。
使用自定义注解
为了方便对比,在User类中同时使用自带的@DateTimeFormat注解、自定义的@MyDateFormat注解。在上一篇代码的基础上,对birthday字段添加@DateTimeFormat注解,新增regTime字段并添加@DateTimeFormat(pattern="yyyy-MM-dd"),修改后的代码如下:
/** * Created by gantianxing on 2017/6/8. */ public class User implements Serializable { private static final long serialVersionUID = 1L; @NotNull(message="{user.name.null}") @Size(min=2,max =5,message = "{user.name.error}") private String name;//姓名 @NotNull(message="{user.birthday.null}") @Past(message="{user.birthday.error}") @MyDateFormat private Date birthday;//生日 @DateTimeFormat(pattern="yyyy-MM-dd") private Date regDate;//注册时间 @NotNull(message="{user.money.null}") @Digits(integer=3,fraction=2,message="{user.money.error}") @NumberFormat(pattern = "¥#.##") private BigDecimal money;//资产 @NotNull(message="{user.phoneNum.null}") @Pattern(regexp="\\d{11}",message="{user.phoneNum.error}") private String phoneNum;//手机号 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } public Date getRegDate() { return regDate; } public void setRegDate(Date regDate) { this.regDate = regDate; } }
启动tomcat,访问http://localhost/add页面,填写表单,Register Date的格式必须为yyyy-MM-dd,输入错误的情况下,报如下错误:
这种错误提示不能直接暴露给用户,我们可以通过打印器错误码,并在国际化配置文件中进行配置。比如这里的打印的错误码为:typeMismatch,在中文和英文的属性配置文件中分别配置:
typeMismatch.user.regDate=格式:yyyy-MM-dd
typeMismatch.user.regDate=Style:yyyy-MM-dd
重启tomcat,重新提交错误格式的regDate表单,显示如下:
再切换到中文(ps:如果切换不成功,tomcat版本请换成tomcat8以上):
同时在birthday字段上使用的自定义注解@MyDateFormat,也已经生效。
如果在同一个表单对象中,有多个Date类型,只需要对其中部分Date字段进行自定义格式化转换,另外的采用Spring MVC默认的格式化转换,这个时候就不得不用到自定义注解实现。
ok, 关于“自定义国际化formatter注解实现”方法讲解完毕,最后奉上代码 GitHub地址:https://github.com/gantianxing/locale-demo2.git。
相关推荐
eclipse代码格式化模板 在Eclipse中:Windows -> Preferences -> java -> Code Style -> Formatter -> Import 自动格式化大括弧自动对齐模板。注释也好看,自用模板
如果需要自定义Formatter,我们只需要实现Formatter接口并覆盖其中的`print`和`parse`方法。`print`方法负责将对象转换为格式化的字符串,而`parse`方法则将符合格式的字符串解析回对象。自定义的Formatter可以通过...
它通过指定模式字符串来实现日期和时间的格式化。例如: ```java import java.text.SimpleDateFormat; import java.util.Date; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ...
导入设置的方法是:`Window` -> `Preferences` -> `Java` -> `Code Style` -> `Formatter`,然后点击"Import"按钮选择对应的`.epf`文件。 总之,Eclipse的代码注解格式化功能是提高代码质量、简化团队合作的重要...
在IT行业中,Spring Boot是一个非常流行的Java框架,用于简化Spring应用程序的开发过程。Spring Boot 2是该框架的最新版本,引入了许多改进和新特性,旨在提高开发效率和应用程序性能。Gradle则是一种强大的构建自动...
在Java编程语言中,日期和时间的格式化是通过`java.text.DateFormat`和`java.text.SimpleDateFormat`类来实现的。这两个类主要用于将日期和时间对象转换为人类可读的字符串,以及将这些字符串解析回日期和时间对象。...
例如,如果你需要将请求参数的日期字符串转换为`java.util.Date`对象,你可以自定义一个`PropertyEditor`实现。Spring MVC会自动寻找合适的`PropertyEditor`并将参数值转换为正确的类型。 `Converter`和`Formatter`...
总结来说,Spring MVC中的数据格式化是通过 `Converter` 和 `Formatter` 实现的,它们使得我们能灵活地处理不同类型数据的转换,特别是在处理输入和输出数据格式化时,如日期、货币或其他自定义类型。通过自定义这些...
在Spring MVC中,注解式控制器是开发Web应用的核心组件之一。它允许开发者通过在控制器方法上使用注解来处理HTTP请求,同时提供了强大的数据验证、类型转换和格式化功能,确保了输入数据的准确性和安全性。下面我们...
综合以上信息,这个项目可能是一个基于Java的桌面应用,使用NetBeans进行开发,包含了代码解析、格式化、注解处理以及日期时间与数字操作的相关功能。可能的应用场景包括但不限于:文本编辑器、数据格式转换工具或...
下面将详细讲解如何在Struts2中实现自定义转换类。 首先,了解Struts2的转换机制。当Action中的字段与请求参数匹配时,Struts2会尝试找到一个合适的转换器来处理这个参数。默认情况下,Struts2通过Action上下文...
在Java开发中,数据序列化和反序列化是常见的需求,XStream库提供了一个方便的解决方案。XStream是一个用于XML、JSON和HTML的Java库,它能够将Java对象转化为XML,反之也能将XML数据还原为Java对象。在这个场景中,...
通过自定义 Runner,可以实现更复杂的测试逻辑,如并行执行测试、限制测试范围等。 5. Ant 与 JUnit 的集成: Ant 是一个流行的构建工具,它可以与 JUnit 配合使用,自动运行测试并收集结果。通过 `<junit>` 标签...
在IT行业中,编程规范和可读性是代码质量的重要组成部分,而良好的注释和格式化则是实现这一目标的关键。Eclipse作为一款广泛使用的Java集成开发环境(IDE),提供了丰富的自定义选项来帮助开发者创建整洁、易读的...
Jackson还支持更复杂的转换,例如自定义序列化和反序列化规则、处理日期时间、处理null值等。同时,它还提供了`readValue()`方法,可以从JSON字符串反序列化回Java对象。 6. **其他JSON库** 如果你不想使用...
- **格式化器(Formatter)**:`Formatter`接口用于对象到字符串和字符串到对象的转换,主要用于格式化显示和解析输入数据,如日期格式化。 - **数据绑定(WebDataBinder)**:WebDataBinder负责将请求参数绑定到...
7. **转换器与格式化器(Converter & Formatter)** - 处理模型数据的输入输出格式,如日期、数字的格式化。 8. **数据绑定** - SpringMVC自动将请求参数绑定到控制器方法的参数上,反之亦然。 9. **异常处理** ...
如果你需要自定义JSON的序列化方式,可以通过配置`application.properties`或`application.yml`文件来实现,例如改变日期格式或忽略某些字段。 总的来说,掌握如何在Google Chrome中安装和使用JSON格式化插件是...
接着,在弹出的"Preferences"窗口左侧导航栏中,依次展开"Java" -> "Code Style" -> "Formatter"。在这里,你可以管理代码格式化器的配置。点击"Formatter"后,右侧会显示相关的设置选项。 要导入自定义的代码格式...