Skip to content

Instantly share code, notes, and snippets.

@disc99
disc99 / Config.java
Created August 26, 2023 00:05
Manual property configuration with Spring Boot
@Configuration
class Config {
@Bean(name = "myDataSource")
DataSource myDataSource(DataSourceProperties dataSourceProperties, ConfigurableEnvironment environment) {
MutablePropertySources propertySources = environment.getPropertySources();
Binder binder = new Binder(ConfigurationPropertySources.from(propertySources));
HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
BindResult<HikariDataSource> result = binder.bind("my.spring.datasource.hikari", Bindable.ofInstance(dataSource));
return result.get();

メッセージキュー

送信元アプリケーション(Publisher)はメッセージキューミドルウェア(Broker/Queue)に対してメッセージを書き込み、連携先からのレスポンスを待つこと無く次の処理を実行。 連携先アプリケーション(Subscriber)はキュー経由でメッセージを取得し処理を進める。

image

  • メッセージ指向
  • Message Passing + Queue
    • 複数オブジェクト間でのメッセージ受け渡し
    • 受け取ったメッセージをQueueに格納
  • 非同期・疎結合
@disc99
disc99 / CacheKey.java
Last active March 9, 2021 12:02
Doma one-to-many mapping
package com.example.demo;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.function.Function;
import static java.util.stream.Collectors.toList;
@EqualsAndHashCode

capture shell

asciinema rec -c bash mycli.cast

cast to gif

public interface MySqlDao {
    default int findRows() {
        return SelectBuilder.newInstance(Config.get(this))
                .sql("SELECT FOUND_ROWS()")
                .getScalarSingleResult(int.class);
    }

    default int lastInsertId() {
        return SelectBuilder.newInstance(Config.get(this))

Examples

Java

protoc -I=$SRC_DIR \
  --java_out=$DST_DIR \
  $SRC_DIR/HelloService.proto

gRPC-Web (Using protoc-gen-grpc-web plugin)

@disc99
disc99 / ApplicationAdvice.java
Created November 3, 2018 09:36
よく使うAOP
import io.grpc.Status;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolationException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collector;
import static java.util.stream.Collectors.*;
#Japanese messages
javax.validation.constraints.AssertFalse.message=Falseでなければなりません。
javax.validation.constraints.AssertTrue.message=Trueでなければなりません。
javax.validation.constraints.DecimalMax.message={value}以下でなければなりません。
javax.validation.constraints.DecimalMin.message={value}以上でなければなりません。
javax.validation.constraints.Digits.message=境界以外の数値(予測:<{integer} digits>.<{fraction} digits>)
javax.validation.constraints.Future.message=未来日付でなければなりません。
javax.validation.constraints.Max.message={value}以下でなければなりません。
javax.validation.constraints.Min.message={value}以上でなければなりません。
javax.validation.constraints.NotNull.message=Nullは許可されていません。