You've successfully subscribed to Заметки Разработчиков
Great! Next, complete checkout for full access to Заметки Разработчиков
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
Success! Your billing info is updated.
Billing info update failed.

java

Сериализация и Десериализация даты в Jackson

Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ и изобретают свои форматы. К сожалению, в Jackson не заложены все возможные форматы даты, поэтому необходимо наиписать свой десериализатор. Десериализация В данном случае это преобразование json формата

Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ и изобретают свои форматы.

К сожалению, в Jackson не заложены все возможные форматы даты, поэтому необходимо наиписать свой десериализатор.

Десериализация

В данном случае это преобразование json формата в Java объект. Необходимо расширить абстрактный класс StdDeserializer.

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CustomDeserializer extends StdDeserializer<LocalDateTime> {

    protected CustomDeserializer() {
        this(null);
    }

    protected CustomDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
        String value = jsonParser.getText();
        if (!"".equals(value)) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
            return LocalDateTime.parse(value, formatter);
        }
        return null;
    }

}

После этого необходимо над полем поставить аннотацию @JsonDeserialize c указанием нашего кастомного десериализатора.

public class Foo {

    // ... ... ... ... ...

    @JsonDeserialize(using = CustomDeserializer.class)
    private LocalDateTime date;

    // ... ... ... ... ...

}

Сериализация

В данном случае это преобразование Java объекта в json формат. Для сериализации необходимо расширить класс StdSerializer.

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CustomSerializer extends StdSerializer<LocalDateTime> {

    protected CustomSerializer(Class<LocalDateTime> t) {
        super(t);
    }

    protected CustomSerializer() {
        this(null);
    }

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
        gen.writeString(formatter.format(value));
    }

}

Для работы над полем поставить аннотацию @JsonSerialize

public class Foo {

    // ... ... ... ... ...

    @JsonSerialize(using = LocalDateTimestampSerializer.class)
    private LocalDateTime date;

    // ... ... ... ... ...

}

Игнорирование ошибок сертификата OkHttp3

Так лучше не делать, но иногда нужно проигнорировать ошибки связанные с сертификатом сайта. import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; import okhttp3.OkHttpClient; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; /** * @author upagge 03.02.2021

Так лучше не делать, но иногда нужно проигнорировать ошибки связанные с сертификатом сайта.
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 * @author upagge 03.02.2021
 */
@Slf4j
@UtilityClass
public class OkHttpUtil {

    private static OkHttpClient client = new OkHttpClient.Builder().build();

    public static OkHttpClient getClient() {
        return client;
    }

    public static void init(boolean ignoreCertificate) {

        OkHttpClient.Builder builder = new OkHttpClient.Builder();

        log.info("Initialising httpUtil with default configuration");
        if (ignoreCertificate) {
            builder = configureToIgnoreCertificate(builder);
        }

        //Other application specific configuration

        client = builder.build();
    }

    //Setting testMode configuration. If set as testMode, the connection will skip certification check
    private static OkHttpClient.Builder configureToIgnoreCertificate(OkHttpClient.Builder builder) {
        log.warn("Ignore Ssl Certificate");
        try {

            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier((hostname, session) -> true);
        } catch (Exception e) {
            log.warn("Exception while configuring IgnoreSslCertificate" + e, e);
        }
        return builder;
    }

}

Как это использовать?

Перед получением OkHttpClient необходимо инициализировать настройки игнорирования сертификатов. Для этого вызываем метод:

OkHttpUtil.init(true);

После этого можете получить OkHttpClient:

OkHttpUtil.getClient();

Или вот так:

public class HttpParse {

    static {
        OkHttpUtil.init(true);
    }

    private static final OkHttpClient client = OkHttpUtil.getClient();

    // ... ... ... ... ...

}

Парсинг URL c помощью регулярки

// Split URL into protocol, domain, port and URI Pattern pattern = Pattern.compile("(https?://)([^:^/]*)(:\\d*)?(.*)?"); Matcher matcher = pattern.matcher(url); matcher.find(); String protocol = matcher.group(1); String domain = matcher.group(2); String port = matcher.group(3); String uri = matcher.group(4); Разделение URL-адреса на протокол, домен, порт и URI с

// Split URL into protocol, domain, port and URI
Pattern pattern = Pattern.compile("(https?://)([^:^/]*)(:\\d*)?(.*)?");
Matcher matcher = pattern.matcher(url);

matcher.find();

String protocol = matcher.group(1);
String domain   = matcher.group(2);
String port     = matcher.group(3);
String uri      = matcher.group(4);

Разделение URL-адреса на протокол, домен, порт и URI с помощью регулярных выражений.

Community day Joker 2022

Завтра будет бесплатный день Java конференции Joker, только нужно зарегистрироваться.

Завтра будет бесплатный день для всех, только нужно зарегистрироваться.

Из интересных докладов, которые хочу посмотреть:

  • Поваренная книга программиста: Vert.x
  • Клуб (не)анонимных монолитиков
  • Как сделать деплой незаметным для пользователя
  • Разработка распределенной очереди с отложенными задачами на основе PostgreSQL
  • Platform V User Sessions — распределенное хранилище сессионных данных

Пока Joker 2022 радует докладами, лучше чем мой опыт с Jpoint 2022.

Персональный билет — Joker 2022. Конференция для опытных Java-разработчиков
Купить персональный билет на конференцию Joker 2022.

Рецензия на первый день Joker 2022

Моя субъективная реакция на первый день конференции Joker 2022. Рассказываю о докладах, которые успел посмотреть.

Итак первый день конференции для Java разработчиков начался. Полноценные рецензии на особенно понравившиеся доклады выложу через полгода, когда они будут опубликованы в публичном доступе.

А вот короткие рецензии на то, что успел посмотреть:

Spring Boot с Amazon Web Services SDK: взаимодействие основных сервисов

Посмотрел минут 30, но буду досматривать в выходные. Кажется доклад ознакомительного характера про возможности работы Spring с AWS. Любопытно посмотреть как там живут люди в облаках. Но перспективы AWS в РФ покрыты туманом. У нас в РФ заказчики предпочитают держать все на своих серверах, а не в облаках. И я тоже пропагандист такого подхода, не хочу продаваться облакам 😅

Так что AWS я скорее не люблю. Да там вроде как все просто, нажал кнопочку и у тебя репликация БД, нажал вторую кнопкочку и у тебя БД зашифрована и доступы извне закрыты.

Но вы за это все платите рублем, и уже множество случаев было, когда бюджет случайно улетал в трубу. Я сам использовал небольшой сервачок AWS под VPN, полгода платил где-то 5$ и горя не знал, а потом в какой-то месяц мне пришел счет на 134$, потому что вышел за пределы выделенного трафика.

Также на проекте работал с AWS S3, но не с облачной версией, а с проектом MinIO. Легко разворачивается в защищенном контуре в виде коробочного решения и полностью совместим с AWS S3.

Архитектура приложения и ошибки проектирования

Приятный доклад о различных архитектурах и их эволюции. Явно буду рекомендовать его посмотреть своим студентам, когда он выйдет в публичный доступ.

Если вы только начинаете свой путь в изучении архитектуры приложений, то доклад явно будет полезным.

Блеск и нищета Hibernate

Не доклад, а дискуссия. Вспоминали прошлое хибернейта. Было интересно, так как я особо не вдавался никогда в историю возникновения хибера. Когда я пришел в разработку, то он уже был сформировавшийся.

Рекомендую послушать по пути куда-нибудь, как подкаст отлично зайдет :)

Hibernate 6: что нового и почему это важно

А этот доклад о том, почему хибер не собирается умирать. В этом докладе рассказывают о новых фишках API, которые появяться, о том что у вас точно сломается. И о том, что изменилось у хибера под капотом.

Спойлер: логи теперь читать будет намного приятнее, а запросы должны будут выполнятсья быстрее. Этот доклад мне понравился больше всего.

P.S.

Не знаю зачем я это пишу, для истории. Буду в старости перечитывать :)