こんばんは、エキサイト株式会社の中尾です。
前回の続きです。
serviceを入れていきます。
serviceには@Singleton
をつけて、@Inject
で呼び出します。
※サンプルです。
- interface
package org.my.hobby.service; import org.my.hobby.core.Book; public interface BookService { Book find(String title); }
- impl
package org.my.hobby.service; import javax.inject.Singleton; import org.my.hobby.core.Book; @Singleton public class BookServiceImpl implements BookService { @Override public Book find(String title) { if (!"hobby".equals(title)) { return new Book("", ""); } return new Book("hobby", "s-nakao"); } }
- model
package org.my.hobby.core; import io.netty.util.internal.StringUtil; public record Book(String title, String author) { public boolean isFind(){ return !StringUtil.isNullOrEmpty(title); } public String message(){ if(isFind()){ return ""; }; return "not found book"; } }
- コントローラー
前回のコントローラーをちょっと改良します。
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; import org.my.hobby.core.Book; import org.my.hobby.service.BookService; 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; @Inject BookService bookService; @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); } final Book book = bookService.find(bookSearchRequest.title()); final BookSearchResponse.Book hobbyBook = new BookSearchResponse.Book(book.title(), book.author()); return new BookSearchResponse(book.isFind(), book.message(), hobbyBook); } }
- curlでアクセス
shogo.nakao@localhost:(App-Db-Blog-Fan) $ 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:(App-Db-Blog-Fan) $ 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:(App-Db-Blog-Fan) $ 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":""}}%
取得できました!よかったですね!
次回、repositoryを作成します。
最後に、弊社では採用もバシバシ実施しているので興味のあるかたがいましたらご応募ください。
Advent Calendar 2021を引き続き楽しんでいただけると嬉しいです。