Spring Boot之基于注解的数据格式化

9 篇文章 0 订阅
2 篇文章 0 订阅

Spring Boot来开发Web应用,大部分使用的是Spring MVC的一些功能及特性。Spring MVC在对数据格式化时,提供了很多内部格式化工具来方便开发人员来对数据进行处理。
具体可以参考:http://blog.csdn.net/jrainbow/article/details/46709543

同样Spring MVC也提供了一些接口让我们方便的扩展,自定义一些方法来处理数据。

我们这里就是使用Spring MVC的AnnotationFormatterFactory接口来实现字符串与java.sql.Timestamp间的格式化。并使用Spring Boot的自动配置功能,将此格式化工具引入到我们的Spring Boot项目中。

1、自定义注解

package xyz.ibenben.parttime.common.formatter.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * @TimestampFormat 注解类型
 * 
 * Timestamp
 * 
 * @author 潘广伟
 * @Email p_3er@qq.com
 * @Date 2015-1-28 上午9:59:52
 * 
 * @version 1.0.0
 *
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME)  
public @interface TimestampFormat {

}

我们先定义一个@TimestampFormat注解,当我们在实体类的属性或属性的getter方法中标上此注解的时候,Spring MVC会知道,此属性接收到的数据需要进行格式化。

如:下面Task实体类的startTime属性。

package xyz.ibenben.parttime.task.entity;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;

import xyz.ibenben.parttime.common.formatter.annotation.TimestampFormat;
import xyz.ibenben.parttime.user.entity.Employer;

public class Task implements Serializable {
    private static final long serialVersionUID = 522265566715251213L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String profession;

    @Column(name = "employer_id")
    private Integer employerId;

    @Column(name = "location_id")
    private Integer locationId;

    @Column(name = "init_time")
    private Timestamp initTime;

    @TimestampFormat
    @Column(name = "start_time")
    private Timestamp startTime;

    @Column(name = "low_hourly_wage")
    private Double lowHourlyWage;

    @Column(name = "hight_hourly_wage")
    private Double hightHourlyWage;

    private String descript;

    private Integer state;

    @Transient
    private TaskSituation situation;

    @Transient
    private Employer employer;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getProfession() {
        return profession;
    }

    public void setProfession(String profession) {
        this.profession = profession;
    }

    public Integer getEmployerId() {
        return employerId;
    }

    public void setEmployerId(Integer employerId) {
        this.employerId = employerId;
    }

    public Timestamp getInitTime() {
        return initTime;
    }

    public void setInitTime(Timestamp initTime) {
        this.initTime = initTime;
    }

    public Timestamp getStartTime() {
        return startTime;
    }

    public void setStartTime(Timestamp startTime) {
        this.startTime = startTime;
    }

    public Double getLowHourlyWage() {
        return lowHourlyWage;
    }

    public void setLowHourlyWage(Double lowHourlyWage) {
        this.lowHourlyWage = lowHourlyWage;
    }

    public Double getHightHourlyWage() {
        return hightHourlyWage;
    }

    public void setHightHourlyWage(Double hightHourlyWage) {
        this.hightHourlyWage = hightHourlyWage;
    }

    public String getDescript() {
        return descript;
    }

    public void setDescript(String descript) {
        this.descript = descript;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public Employer getEmployer() {
        return employer;
    }

    public void setEmployer(Employer employer) {
        this.employer = employer;
    }

    public Integer getLocationId() {
        return locationId;
    }

    public void setLocationId(Integer locationId) {
        this.locationId = locationId;
    }

    public TaskSituation getSituation() {
        return situation;
    }

    public void setSituation(TaskSituation situation) {
        this.situation = situation;
    }

}

2、实现AnnotationFormatterFactory

package org.springframework.format;

public interface AnnotationFormatterFactory<A extends Annotation> {

    Set<Class<?>> getFieldTypes();

    Printer<?> getPrinter(A annotation, Class<?> fieldType);

    Parser<?> getParser(A annotation, Class<?> fieldType);

}

上面是AnnotationFormatterFactory接口的定义:

  1. getFieldTypes() 返回的是所有会用于属性上说明需要格式化的注解集合。
  2. getPrinter() 返回的是此格式化工厂使用到的格式化工具。
  3. getParser()返回的是反(逆)格式化的工具。

java.sql.Timestamp的格式化处理如下:

  • 注解集合
        Set<Class<?>> set = new HashSet<Class<?>>();  
        set.add(Timestamp.class);  
        this.fieldTypes = set;  
    public Set<Class<?>> getFieldTypes() {
        return fieldTypes;
    }
  • 格式化工具
    /**
     * 字符转Timestamp类型格式化类
     * 
     * TimestampFormatter
     * 
     * @author 潘广伟
     * @Email p_3er@qq.com
     * @Date 2015-1-28 上午11:34:35
     * 
     * @version 1.0.0
     *
     */
    private class TimestampFormatter implements Formatter<Timestamp>,Serializable{
        private static final long serialVersionUID = -818656464607971661L;


        public String print(Timestamp value, Locale locale) {
            if(value == null) {  
                return "";  
            }  
            return value.toString();
        }


        public Timestamp parse(String value, Locale locale) throws ParseException {
            if(value.length() == 16){
                value = new StringBuffer(value).append(":00").toString();
            }
            return Timestamp.valueOf(value);
        }

    }

此工具同时包含Printer及Parser。

    public Parser<Timestamp> getParser(TimestampFormat annotation, Class<?> fieldType) {
        return formatter;  
    }


    public Printer<Timestamp> getPrinter(TimestampFormat annotation, Class<?> fieldType) {
        return formatter;  
    }

完整代码:

package xyz.ibenben.parttime.common.formatter;

import java.io.Serializable;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

import org.springframework.format.AnnotationFormatterFactory;
import org.springframework.format.Formatter;
import org.springframework.format.Parser;
import org.springframework.format.Printer;

import xyz.ibenben.parttime.common.formatter.annotation.TimestampFormat;


/**
 * Timestamp注解格式化工厂
 * 
 * TimestampFormatAnnotationFormatterFactory
 * 
 * @author 潘广伟
 * @Email p_3er@qq.com
 * @Date 2015-1-28 上午10:20:47
 * 
 * @version 1.0.0
 *
 */
public class TimestampFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<TimestampFormat>{
    private final Set<Class<?>> fieldTypes;  
    private final TimestampFormatter formatter;  

    public TimestampFormatAnnotationFormatterFactory() {
        Set<Class<?>> set = new HashSet<Class<?>>();  
        set.add(Timestamp.class);  
        this.fieldTypes = set;  
        this.formatter = new TimestampFormatter();
    }


    public Set<Class<?>> getFieldTypes() {
        return fieldTypes;
    }


    public Parser<Timestamp> getParser(TimestampFormat annotation, Class<?> fieldType) {
        return formatter;  
    }


    public Printer<Timestamp> getPrinter(TimestampFormat annotation, Class<?> fieldType) {
        return formatter;  
    }

    /**
     * 字符转Timestamp类型格式化类
     * 
     * TimestampFormatter
     * 
     * @author 潘广伟
     * @Email p_3er@qq.com
     * @Date 2015-1-28 上午11:34:35
     * 
     * @version 1.0.0
     *
     */
    private class TimestampFormatter implements Formatter<Timestamp>,Serializable{
        private static final long serialVersionUID = -818656464607971661L;


        public String print(Timestamp value, Locale locale) {
            if(value == null) {  
                return "";  
            }  
            return value.toString();
        }


        public Timestamp parse(String value, Locale locale) throws ParseException {
            if(value.length() == 16){
                value = new StringBuffer(value).append(":00").toString();
            }
            return Timestamp.valueOf(value);
        }

    }

}

3、配置

Spring MVC中的配置:

<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
      <property name="formatters">  
          <list>  
              <bean class="com.benben.timetable.common.formatter.TimestampFormatAnnotationFormatterFactory"/>  

          </list>  
      </property>  
    </bean> 

如果我们既想使用Spring Boot MVC那么便捷的开发,又想获得额外的一些MVC配置,如interceptors, formatters, view controllers等的话,可以使用继承WebMvcConfigurerAdapter来加入这些配置。并使用@Configuration来交由Spirng Boot来自动配置。

如我们要在Spring Boot项目中使用格式化功能,重写WebMvcConfigurerAdapter的addFormatters方法。

package xyz.ibenben.parttime.common.configure;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import xyz.ibenben.parttime.common.formatter.TimestampFormatAnnotationFormatterFactory;


@Configuration
public class SpringConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatterForFieldAnnotation(new TimestampFormatAnnotationFormatterFactory());
        super.addFormatters(registry);
    }

}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源说明】 1、基于spring-boot+vuejs+element-ui的新闻发布管理系统源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于spring-boot+vuejs+element-ui的新闻发布管理系统源码+项目说明.zip <h1 style="text-align: center">EL-NEWS新闻发布管理系统</h1> <div style="text-align: center"> 项目简介 一个基于 Spring BootSpring Boot Jpa、 JWT、Spring Security、Redis、Vue、eladmin的新闻发布管理系统 **初始账号密码:** `admin / 123456` #### 主要特性 - 使用最新技术栈,社区资源丰富。 - 高效率开发,代码生成器可一键生成前后端代码 - 支持数据字典,可方便地对一些状态进行管理 - 支持接口限流,避免恶意请求导致服务层压力过大 - 支持接口级别的功能权限与数据权限,可自定义操作 - 自定义权限注解与匿名接口注解,可快速对接口拦截与放行 - 对一些常用地前端组件封装:表格数据请求、数据字典等 - 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断 - 支持在线用户管理与服务器性能监控,支持限制单用户登录 - 支持运维管理,可方便地对远程服务器的应用进行部署与管理 #### 系统功能 - 用户管理:提供用户的相关配置,新增用户后,默认密码为123456 - 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限 - 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单 - 部门管理:可配置系统组织架构,树形表格展示 - 岗位管理:配置各个部门的职位 - 字典管理:可维护常用一些固定的数据,如:状态,性别等 - 系统日志:记录用户操作日志与异常日志,方便开发人员定位排错 - SQL监控:采用druid 监控数据库访问性能,默认用户名admin,密码123456 - 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然 - 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务 - 邮件工具:配合富文本,发送html格式的邮件 - 七牛云存储:可同步七牛云存储的数据到系统,无需登录七牛云直接操作云数据 - 支付宝支付:整合了支付宝支付并且提供了测试账号,可自行测试 - 服务监控:监控服务器的负载情况 - 运维管理:一键部署你的应用 - 新闻管理:发布新闻、评论、标签、类型管理 #### 演示图 <table> <tr> <td><img src="https://blog-me-001.oss-cn-beijing.aliyuncs.com/%E6%88%AA%E5%B1%8F2022-05-08%2014.54.37.png"/></td> <td><img src="https://blog-me-001.oss-cn-beijing.aliyuncs.com/%E6%88%AA%E5%B1%8F2022-05-08%2014.53.56.png"/></td> </tr> </table>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值