--- title: JJUG CCC 2024 Springで"知名度は高くないけど便利なJavaライブラリ集"について話してきました。 tags: ["Java", "Spring Boot", "Jilt", "YAVI", "Logbook", "NullAway"] categories: ["Programming", "Java", "am", "ik", "yavi"] date: 2024-06-17T08:25:25Z updated: 2024-06-17T23:18:06Z --- [JJUG CCC 2024 Spring](https://jjug.doorkeeper.jp/events/172019)で"知名度は高くないけど便利なJavaライブラリ集"について話しました。 スライド 以下の4つライブラリを紹介しました。このブログの実装にも全て使用しています。 * [Jilt](https://github.com/skinny85/jilt) * [YAVI](https://github.com/making/yavi) * [Logbook](https://github.com/zalando/logbook) * [NullAway](https://github.com/uber/NullAway) なお、知名度は以下の通りでした。自分のXフォロワー周辺に聞いているので、自分が作っているYAVIについては流石に知名度が高めでした😅 * Jilt
![image](https://github.com/making/blog.ik.am/assets/106908/40e8a228-d911-484b-bb1d-36003c5dc134) * YAVI
![image](https://github.com/making/blog.ik.am/assets/106908/22dd0dd3-895d-4a3e-8278-df1a3321de44) * Logbook
![image](https://github.com/making/blog.ik.am/assets/106908/36b684c9-40d2-418d-a6f2-6a90a72719eb) * NullAway
![image](https://github.com/making/blog.ik.am/assets/106908/f3a3b3c3-e274-43f6-9129-09358c508b5b) セッションの最後のQ&Aでは、"YAVIはプレゼン層で利用する想定か?"と聞かれました。 サンプルはわかりやすくするため、プレゼン層で利用する例を上げましたが、どちらかというとドメイン側で利用する想定です。 そのため、[ドメイン側で定義したValidatorをプレゼン用に変換することを想定した機能](https://yavi.ik.am/#validating-the-source-object-before-creating-the-target-object) も用意しています。 サンプル。次の`User`クラスで定義したValidator ```java import am.ik.yavi.arguments.Arguments3Validator; import am.ik.yavi.validator.Yavi; import static am.ik.yavi.constraint.charsequence.codepoints.AsciiCodePoints.ASCII_PRINTABLE_CHARS; public record User(String name, String email, Integer age) { public static final Arguments3Validator validator = Yavi.arguments() ._string("name", c -> c.notBlank().lessThanOrEqual(20).codePoints(ASCII_PRINTABLE_CHARS).asWhiteList()) ._string("email", c -> c.notBlank().lessThanOrEqual(50).email()) ._integer("age", c -> c.notNull().greaterThanOrEqual(0).lessThanOrEqual(200)) .apply(User::new); } ``` を、`UserForm`クラスのバリデーションに使いたい時、 ```java import am.ik.yavi.arguments.Arguments; import am.ik.yavi.core.ValueValidator; import com.example.yavi.domain.User; import jakarta.annotation.Nullable; public record UserForm(@Nullable String name, @Nullable String email, @Nullable Integer age) { static ValueValidator validator = User.validator .compose(userForm -> Arguments.of(userForm.name(), userForm.email(), userForm.age())); } ``` という風に`UserForm`を受けて、`User`を返すValidatorに変換できます。 ```java UserForm userForm = ...; Validated userValidated = UserForm.validator.validate(userForm); ``` という形で使えます。 全ソースコードはこちらです https://github.com/making/demo-spring-mvc-yavi 発表後にJilt 1.6がリリースされ、新たに[Functional Builders](https://github.com/skinny85/jilt?tab=readme-ov-file#functional-builder-style)がサポートされました。 https://github.com/skinny85/jilt/issues/17 ご清聴ありがとうございました。