`

Java国际化之(五)---自定义国际化formatter注解实现

阅读更多

引言

 

由于Spring MVC自带的@NumberFormat@DateTimeFormat格式化不能很好的支持国际化,在《java国际化之---springMVC+Freemaker demo()http://moon-walker.iteye.com/blog/2379940demo中我们实现了自定的formatterMyDateFormatterMyCurrencyFormatter分别支持国际化的日期、货币处理。但有个弊端,表单对象中所有的DateBigDecimal类型都会进行相同规则的转换,不能像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

  • 大小: 40.5 KB
  • 大小: 25.5 KB
  • 大小: 18 KB
  • 大小: 15.6 KB
1
2
分享到:
评论

相关推荐

    eclipse格式化和自动注释模板

    eclipse代码格式化模板 在Eclipse中:Windows -&gt; Preferences -&gt; java -&gt; Code Style -&gt; Formatter -&gt; Import 自动格式化大括弧自动对齐模板。注释也好看,自用模板

    30 Spring Core格式化Formatter实现示例及背后原理探究慕课专栏1

    如果需要自定义Formatter,我们只需要实现Formatter接口并覆盖其中的`print`和`parse`方法。`print`方法负责将对象转换为格式化的字符串,而`parse`方法则将符合格式的字符串解析回对象。自定义的Formatter可以通过...

    Java的日期格式化常用方法

    它通过指定模式字符串来实现日期和时间的格式化。例如: ```java import java.text.SimpleDateFormat; import java.util.Date; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ...

    Eclipse代码注解格式化

    导入设置的方法是:`Window` -&gt; `Preferences` -&gt; `Java` -&gt; `Code Style` -&gt; `Formatter`,然后点击"Import"按钮选择对应的`.epf`文件。 总之,Eclipse的代码注解格式化功能是提高代码质量、简化团队合作的重要...

    ide搭建的gradle构建的springboot2源代码

    在IT行业中,Spring Boot是一个非常流行的Java框架,用于简化Spring应用程序的开发过程。Spring Boot 2是该框架的最新版本,引入了许多改进和新特性,旨在提高开发效率和应用程序性能。Gradle则是一种强大的构建自动...

    详解Java中格式化日期的DateFormat与SimpleDateFormat类

    在Java编程语言中,日期和时间的格式化是通过`java.text.DateFormat`和`java.text.SimpleDateFormat`类来实现的。这两个类主要用于将日期和时间对象转换为人类可读的字符串,以及将这些字符串解析回日期和时间对象。...

    SpringMVC之DataBinding和Validation--Validator,PropertyEditor,Converter,Formatter

    例如,如果你需要将请求参数的日期字符串转换为`java.util.Date`对象,你可以自定义一个`PropertyEditor`实现。Spring MVC会自动寻找合适的`PropertyEditor`并将参数值转换为正确的类型。 `Converter`和`Formatter`...

    java 常见面试题

    - 四舍五入取小数点前两位:使用 `DecimalFormat` 类进行格式化,例如 `formatter.format(money)`。 4. **日期和时间操作**: - 获取年月日、时分秒:可以使用 `Calendar` 类或者 `java.sql.Date` 和 `java.sql....

    SpringMVC数据格式化.docx

    总结来说,Spring MVC中的数据格式化是通过 `Converter` 和 `Formatter` 实现的,它们使得我们能灵活地处理不同类型数据的转换,特别是在处理输入和输出数据格式化时,如日期、货币或其他自定义类型。通过自定义这些...

    springmvc注解式控制器的数据验证、类型转换及格式化 SpringMVC数据验证

    在Spring MVC中,注解式控制器是开发Web应用的核心组件之一。它允许开发者通过在控制器方法上使用注解来处理HTTP请求,同时提供了强大的数据验证、类型转换和格式化功能,确保了输入数据的准确性和安全性。下面我们...

    cull-back.rar_back

    综合以上信息,这个项目可能是一个基于Java的桌面应用,使用NetBeans进行开发,包含了代码解析、格式化、注解处理以及日期时间与数字操作的相关功能。可能的应用场景包括但不限于:文本编辑器、数据格式转换工具或...

    struts2自定义编写转换类

    下面将详细讲解如何在Struts2中实现自定义转换类。 首先,了解Struts2的转换机制。当Action中的字段与请求参数匹配时,Struts2会尝试找到一个合适的转换器来处理这个参数。默认情况下,Struts2通过Action上下文...

    XStream的Date转换 @XStreamConverter DateConverter

    在Java开发中,数据序列化和反序列化是常见的需求,XStream库提供了一个方便的解决方案。XStream是一个用于XML、JSON和HTML的Java库,它能够将Java对象转化为XML,反之也能将XML数据还原为Java对象。在这个场景中,...

    javajunit源码-ant-java-junit:我的页面上的Java单元测试JUnit的源代码:http://jumpstartprog

    通过自定义 Runner,可以实现更复杂的测试逻辑,如并行执行测试、限制测试范围等。 5. Ant 与 JUnit 的集成: Ant 是一个流行的构建工具,它可以与 JUnit 配合使用,自动运行测试并收集结果。通过 `&lt;junit&gt;` 标签...

    eclipse注释/java格式模板

    在IT行业中,编程规范和可读性是代码质量的重要组成部分,而良好的注释和格式化则是实现这一目标的关键。Eclipse作为一款广泛使用的Java集成开发环境(IDE),提供了丰富的自定义选项来帮助开发者创建整洁、易读的...

    java对象集合转json格式

    Jackson还支持更复杂的转换,例如自定义序列化和反序列化规则、处理日期时间、处理null值等。同时,它还提供了`readValue()`方法,可以从JSON字符串反序列化回Java对象。 6. **其他JSON库** 如果你不想使用...

    专题资料(2021-2022年)SpringMVC数据类型转换要点.doc

    - **格式化器(Formatter)**:`Formatter`接口用于对象到字符串和字符串到对象的转换,主要用于格式化显示和解析输入数据,如日期格式化。 - **数据绑定(WebDataBinder)**:WebDataBinder负责将请求参数绑定到...

    达内SpringMVC代码例子+笔记2

    7. **转换器与格式化器(Converter & Formatter)** - 处理模型数据的输入输出格式,如日期、数字的格式化。 8. **数据绑定** - SpringMVC自动将请求参数绑定到控制器方法的参数上,反之亦然。 9. **异常处理** ...

    springboot编程中在google浏览器格式化显示json格式数据

    如果你需要自定义JSON的序列化方式,可以通过配置`application.properties`或`application.yml`文件来实现,例如改变日期格式或忽略某些字段。 总的来说,掌握如何在Google Chrome中安装和使用JSON格式化插件是...

    代码格式化模版导入eclipse说明书.docx

    接着,在弹出的"Preferences"窗口左侧导航栏中,依次展开"Java" -&gt; "Code Style" -&gt; "Formatter"。在这里,你可以管理代码格式化器的配置。点击"Formatter"后,右侧会显示相关的设置选项。 要导入自定义的代码格式...

Global site tag (gtag.js) - Google Analytics