quarkusを使う(バリデーション編)

こんばんは、エキサイト株式会社の中尾です。

前回の続きです。 必要そうなツールを入れていきます。 まず、バリデーションを追加します。

  • gradleに以下を追加
implementation 'io.quarkus:quarkus-hibernate-validator'

java17にしているのでもちろんRecordを使います。

package org.my.hobby;

import javax.inject.Inject;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.constraints.NotBlank;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.Set;
import java.util.stream.Collectors;

record BookSearchRequest(
        @NotBlank(message = "Title may not be blank") String title) {
}

record BookSearchResponse(
        boolean success,
        String message,
        Book book) {
    record Book(String title, String author) {
    }
}

@Path("/book/search")
public class BookController {

    @Inject
    Validator validator;

    /**
     * 書籍をタイトルで検索
     *
     * @param bookSearchRequest
     * @return
     */
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public BookSearchResponse search(BookSearchRequest bookSearchRequest) {
        Set<ConstraintViolation<BookSearchRequest>> violations = validator.validate(bookSearchRequest);
        if (!violations.isEmpty()) {
            final String errorMessage = violations
                    .stream()
                    .map(e -> e.getMessage())
                    .collect(Collectors.joining(","));
            final BookSearchResponse.Book hobbyBook = new BookSearchResponse.Book("", "");
            return new BookSearchResponse(false, errorMessage, hobbyBook);
        }

        if (!"hobby".equals(bookSearchRequest.title())) {
            final BookSearchResponse.Book hobbyBook = new BookSearchResponse.Book("", "");
            return new BookSearchResponse(false, "not found book", hobbyBook);
        }

        final BookSearchResponse.Book hobbyBook = new BookSearchResponse.Book("hobby", "s-nakao");
        return new BookSearchResponse(true, "", hobbyBook);
    }
}
  • postmanでアクセス
shogo.nakao@localhost: $ curl --location --request POST 'http://localhost:8080/book/search' \
--header 'Content-Type: application/json' \
--data-raw '{
        "title": "hobby"
}'
{"success":true,"message":"","book":{"title":"hobby","author":"s-nakao"}}%
shogo.nakao@localhost: $ curl --location --request POST 'http://localhost:8080/book/search' \
--header 'Content-Type: application/json' \
--data-raw '{
        "title": "s-nakao"
}'
{"success":false,"message":"not found book","book":{"title":"","author":""}}%
shogo.nakao@localhost: $ curl --location --request POST 'http://localhost:8080/book/search' \
--header 'Content-Type: application/json' \
--data-raw '{
}'
{"success":false,"message":"Title may not be blank","book":{"title":"","author":""}}%
shogo.nakao@localhost: $

ちゃんとバリデーションできていますね!嬉しい嬉しい!

springbootと違ってbindingResultは使えないですが、、、(もしかしたら使える方法があるかも?今後調べます)

次回、さらに必要そうなツールを入れるに移動します。

最後に、弊社では採用もバシバシ実施しているので興味のあるかたがいましたらご応募ください。

www.wantedly.com



Advent Calendar 2021を引き続き楽しんでいただけると嬉しいです。

qiita.com