Spring Boot(四):利用注解自定义日期格式化

在日期的格式化过程中,我们有时候需要将日期格式化到秒或者微妙,有时候又仅仅需要将日期格式化到日期,所以定义全局的日期格式化肯定难以满足需求,这时就需要一种更灵活的方法。

在Spring Boot对JSON的处理类中,定义了annotationIntrospector属性,专用于处理注解,因此自定义日期格式化的步骤分为四步,如下:
1. 定义日期格式化注解,用于盛放格式化样式;
2. 定义日期JSON串行化化处理类;
3. 定义注解处理类;
4. 配置Spring容器;

1. 定义注解

此注解只需要知道日期格式化的样式即可,如“YYYY-MM-dd”,所以只需要一个配置属性即可,如下:

@Target( {ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DateFormatter {

    //  用于储存日期格式化样式
    String value() default "yyyy-MM-dd";

}

2. 定义JSON串行化处理类

通过注解获取到了日期格式化样式,又有了日期的输入值,现在就可以进行JSON串行化了,如下;

public class DateTimeSerializer extends JsonSerializer<Date> {

    //  用于储存日期串行化格式
    private final String key;

    /**
     * @param key
     */
    public DateTimeSerializer(String key) {
        super();
        this.key = key;
    }

    /* (non-Javadoc)
     * @see com.fasterxml.jackson.databind.JsonSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
     */
    @Override
    public void serialize(Date value, JsonGenerator jgen,
            SerializerProvider provider)
            throws IOException, JsonProcessingException {
        String output = StringUtils.EMPTY;
        if(value != null) {
            //  将日期转换为字符串
            output = new SimpleDateFormat(key).format(value);
        }
         //  输出转换结果
        jgen.writeString(output);
    }

}

3. 定义注解处理类

JAVA对象转换JSON字符串的处理类ObjectMapper可以定义方法、属性的JSON转换过程,如下:

public class MyAnnotationIntrospector extends JacksonAnnotationIntrospector {
    /* (non-Javadoc)
     * @see com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector#findSerializer(com.fasterxml.jackson.databind.introspect.Annotated)
     */
    @Override
    public Object findSerializer(Annotated annotated) {
        //  经测试,只对方法有用
        if(annotated instanceof AnnotatedMethod) {
            DateFormatter formatter = annotated.getAnnotated().getAnnotation(DateFormatter.class);
            if(formatter != null) {
                return new DateTimeSerializer(formatter.value());
            }
        }
        return super.findSerializer(annotated);
    }

}

在我的测试中,好像只对方法上的注解有效(即getter上的注解)。

4. 配置Spring容器

配置又分为两步,一是配置ObjectMapper,如下:

<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
    <property name="annotationIntrospector">
        <bean class="com.mirana.json.MyAnnotationIntrospector"/>
    </property>
</bean>

二是配置HTTP消息转换器,如下:

<mvc:annotation-driven validator="validator">
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

现在可以直接应用注解了,每个属性都可以格式化为不同的输出,如下:

//  默认的短格式
@DateFormatter
public Date getClient_time() {
    return client_time;
}

//  更换为长格式
@DateFormatter("yyyy-MM-dd HH:mm:ss")
public Date getClient_time() {
    return client_time;
}

结论

通过使用注解,可以自定义日期的格式化样式,降低类型转换的工作量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值