Spring Bootの注記ベースのデータフォーマット

21303 ワード

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 [email protected]
 * @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インタフェースの定義は次のとおりです.
  • getFieldType()は、属性の説明に使用されるフォーマットが必要なすべての注釈セットを返します.
  • getPrinter()は、このフォーマットファクトリで使用されているフォーマットツールを返します.
  • getParser()は、逆(逆)フォーマットのツールを返します.

  • JAva.sql.Timestampのフォーマット処理は以下の通りです.
  • 注記セット
  •         Set> set = new HashSet>();  
            set.add(Timestamp.class);  
            this.fieldTypes = set;  
        public Set> getFieldTypes() {
            return fieldTypes;
        }
    
  • フォーマットツール
  •     /**
         *    Timestamp      
         * 
         * TimestampFormatter
         * 
         * @author    
         * @Email [email protected]
         * @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 getParser(TimestampFormat annotation, Class> fieldType) {
            return formatter;  
        }
    
    
        public Printer 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> fieldTypes;  
        private final TimestampFormatter formatter;  
    
        public TimestampFormatAnnotationFormatterFactory() {
            Set> set = new HashSet>();  
            set.add(Timestamp.class);  
            this.fieldTypes = set;  
            this.formatter = new TimestampFormatter();
        }
    
    
        public Set> getFieldTypes() {
            return fieldTypes;
        }
    
    
        public Parser getParser(TimestampFormat annotation, Class> fieldType) {
            return formatter;  
        }
    
    
        public Printer 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のような便利な開発とインターネット、formatters、view controllersなどの追加のMVC構成を利用したい場合は、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);
        }
    
    }