Spring設定jackson変換Date、LocalDateTime

6347 ワード


業務需要:先端の対象に伝わるLocalDateTimeをタイムスタンプに変えます.(JDKはすでに8に昇格したので、LocalDateTimeを全面的に使う)
 
一部の注釈を通じて
    指定した日付書式属性フィールドにコメントを追加します.
    書式設定、 この注釈はSpringによって提供される.
    @DateTimeFormat(pattern= "yyyy-MM-dd HH:mm:ss")
    フォーマットに参加して、この注釈はjackson(jackson-annotations)から提供して、timezoneは持って行きます.さもなくば表示のは0時区の時間です.
     @JsonFormat( pattern= "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 
ガチョウは本プロジェクトの後期にこの需要を処理しますので、一つ一つ追加するのがおっくうです.しかも、注釈が多すぎて、読書に影響します.
二、グローバル設定
    1.Dateを変換する
        a.Dateがタイムスタンプに変わります.
            ジャックソンが配置されていますが、デフォルトではDateをタイムスタンプに変えます.
        b.Dateを指定されたフォーマットに変換する時間サブストリング
            XMLには以下のように配置されています.対応するdateFormatを指定すればいいです.
    
        
            
                
            
        
    
    2.LocalDateTimeを変換する
        ここでLocalDateTimeをタイムスタンプにする方法を記録します.毎回検索しなくてもいいです.
    Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
    long millis = instant.toEpochMilli();
        jacksonでLocal DateTimeを変換するには、カバンを入れなければなりません.
        
       		com.fasterxml.jackson.datatype
        	jackson-datatype-jsr310
            2.9.8
        
        object Mapperの設定
    @Bean
    @Primary
    public ObjectMapper jacksonObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        //       mapper      ,                   
        // Include.Include.ALWAYS   
        // Include.NON_DEFAULT           
        // Include.NON_EMPTY      ("")     NULL      ,    json        。           
        // Include.NON_NULL    NULL     ,   null         
        // objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        //     , null   ""
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator,
                                  SerializerProvider serializerProvider)
                    throws IOException, JsonProcessingException {
                jsonGenerator.writeString("");
            }
        });

        JavaTimeModule javaTimeModule = new JavaTimeModule();
        /*javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));*/

        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
        //                
        javaTimeModule.addSerializer(Date.class, new DateToLongSerializer());
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateToLongSerializer());
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeToLongSerializer());


        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }
       このうちLocal DateTimeToLongSerializerコードは以下の通りです.
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class LocalDateTimeToLongSerializer extends JsonSerializer {
    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException {
        Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        long millis = instant.toEpochMilli();
        jsonGenerator.writeNumber(millis);
    }
}
     そして設定 MappingJackson 2 Http Message Coverter 
    
        
            
                application/json;charset=UTF-8
            
        
        
    
    本来なら大丈夫です.ただし、ガチョウはプロジェクトには効果がありません.資料を二時間探しています.うかつでもあります.中には問題を解決できるような書き込みがありますが、詳しく見ていません.主にこの方面を考慮していませんでした.(もっと怪しい問題なら、もっと簡単です.).この記事を見るまでは.  SpringMVCはJava 8時間JSONデータのフォーマット問題を解決します. .下記のコードの優先度は上記のコードより高いと記載されています.
    
        
        
            
                
                
                    
                        application/json;charset=UTF-8
                    
                
            
        
    
        これで問題を解決します.
        しかし、後者の優先度が低いとしても、なぜ無効になりますか?
 
参考:
1. @DateTimeFormatと@Json Format注释
2.JsonのMappingJackson 2 HttpMessage Coverterの使い方を解析する
3.spring boot LocalDateTimeなどjava 8時間類の序列化と反序列化のサポートを追加します.
4.Java 8 Local DateTimeタイムスタンプ
5. SpringMVC@ResponseBodyを使用すると、Jsonの日付フォーマットに戻ります.@DatetimeFormatはご注意ください.  
以上の作者に感謝します.