Skip to content

Instantly share code, notes, and snippets.

@fsans
Last active May 20, 2023 10:28
Show Gist options
  • Save fsans/defeee5f6dbdaa172fb997d69e143bb4 to your computer and use it in GitHub Desktop.
Save fsans/defeee5f6dbdaa172fb997d69e143bb4 to your computer and use it in GitHub Desktop.

Provides (Spring) to/from FileMaker Input/output date serialization as Instant using any custom format ( ie. yyyy-MM-dd HH:mm:ss )

  • Always define dates as Instant in your java app or service
  • Define dates as Timestamp in FileMaker

your_root_package.config.ConfigurationProperties

package your_root_package.config;

import your_root_package.DateConverter;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import java.time.Instant;

@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false)
public class ApplicationProperties {

    /** CUSTOM DATE SERIALIZER/DESERIALIZER TO ACCEPT ANY PARTICULAR DATE FORMAT **/

    @Bean
    public Module module() {  // register as module
        SimpleModule module = new SimpleModule();
        module.addSerializer(Instant.class, new DateConverter.Serialize());         // register as serialize class for Instant.class
        module.addDeserializer(Instant.class, new DateConverter.Deserialize());     //  register as deserialize class for Instant.class
        return module;
    }

}

your_root_package.config.DateConverter

package your_root_package.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import org.springframework.boot.jackson.JsonComponent;


/** CUSTOM DATE SERIALIZER/DESERIALIZAER TO ACCEPT ANY PARTICULAR DATE FORMAT **/

@JsonComponent
public class DateConverter {

    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final SimpleDateFormat sdf1 = new SimpleDateFormat(DATE_FORMAT);


    public static class Serialize extends JsonSerializer<Instant> {
        @Override
        public void serialize(Instant value, JsonGenerator jgen, SerializerProvider provider) {
            try {
                if (value == null) {
                    jgen.writeNull();
                }
                else {
                    jgen.writeString(DateTimeFormatter.ofPattern(DATE_FORMAT).withZone(ZoneId.systemDefault()).format(value) );
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    public static class Deserialize extends JsonDeserializer<Instant> {
        @Override
        public Instant deserialize(com.fasterxml.jackson.core.JsonParser jp, DeserializationContext ctxt) throws IOException {
            try {
                String dateAsString = jp.getText();
                if (dateAsString==null) {
                    return null;
                } else {
                    return Instant.ofEpochMilli(sdf1.parse(dateAsString).getTime());
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment