Spring Bootの起動時に文字列の配列を渡す

Spring Bootの起動時に文字列の配列を渡す方法です。 以下のようなオプションを付与することで pokemons に文字列の配列を渡すことができます。 java \ -jar -Dexec.mainClass=com.swiswiswift.spring.Application build/libs/spring-0.0.1-SNAPSHOT.jar \ --pokemons='"snorlax","pikachu","ditto"'


SpringBootでログをファイルに出力する

SpringBootでログをファイルに出力する方法です。 application.properties に logging.file.name=spring.log を追加するとログがファイルとしても出力されます。 ローカルではコンソールにログを出す、サーバーではコンソールとファイルにログを出したい場合は実行時にプロパティを渡すことで実現できます。 java spring.jar --server.port=80 --logging.file.name=spring.log 参考


SpringBootでマークダウンをHTMLに変換してThymeleafで表示する

SpringBootでマークダウンをHTMLに変換してThymeleafで表示する方法です。 マークダウンをHTMLに変換するライブラリとして flexmark-javaを使用しました。 build.gradle の dependencies に flexmark-java を追加します。 implementation 'com.vladsch.flexmark:flexmark-all:0.62.2' markdown.html を作成し、Templateフォルダに追加します。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Markdown</title> </head> <body> [(${html})] </body> </html> /markdown エンドポイントを追加します。 markdown 変数を変換し、 html 変数に入れています。 @GetMapping("/markdown") public String getMarkdown(Model model) { // create parser and renderer instance Parser parser = Parser.builder().build(); HtmlRenderer renderer = HtmlRenderer.builder().build() String markdown = "# hello\n## world\n![Fried Shrimp Triangle](http://imgur.com/Jjwsc.jpg \"Sample\")" // convert to markdown to html Node document = parser.


Springを使ってお問い合わせフォームを作るその6

Springを使ってお問い合わせフォームを作るその6です。 今回は作ったアプリケーションをサーバーにデプロイしていきます。 conoha にログインし、サーバーを立てます。 OS は Ubuntu の20系で、一番小さい(安い)インスタンスを作成します。 サーバーが起動したらIPアドレスが表示されるのでそのIPアドレスをコピーします。 ここでは 160.251.74.232 がサーバーのIPアドレスです。 このIPアドレスはサーバーを起動する度に変わるので 160.251.74.232 ではなく表示された値を使用してください。 サーバーにログインします。 ssh root@160.251.101.154 初回接続時は以下の警告が出るので yes と入力します。 Are you sure you want to continue connecting (yes/no/[fingerprint])? パッケージの一覧、パッケージ本体の更新を行います。 何か聞かれたらとりあえず Y を入力します。 apt -y update apt -y upgrade Java11をインストールします。 apt -y install openjdk-11-jdk 11系が入ったことを確認します。 java --version openjdk 11.0.11 2021-04-20 OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04) OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing) MySQLをインストールします。 apt -y install mysql-server MySQLが入ったことを確認します。


Springを使ってお問い合わせフォームを作るその5

Springを使ってお問い合わせフォームを作るその5です。 前回自体でアプリケーションは大体できたので、今回からはサーバーへのアップロードの準備していきます。 作成したアプリケーションを .jar ファイルにします。 .jar ファイルにするとアプリケーションを1つのファイルにまとめることにできます。 ./gradlew build .jar は build/libs に spring-0.0.1-SNAPSHOT.jar という名前で書き出されるので確認します。 .jar ファイルがある場所で以下のコマンドが実行するとアプリケーションが起動します。 たとえば以下のコマンドを実行すると localhost:8080 で起動します。 java -jar spring-0.0.1-SNAPSHOT.jar プロパティを追加して実行することも可能です。 以下の例では localhost:80 でアプリケーションを起動します。 java -jar spring-0.0.1-SNAPSHOT.jar --server.port=80


Springを使ってお問い合わせフォームを作るその4

Springを使ってお問い合わせフォームを作るその4です。 今回はフォームから DB に追加できるようにします。 getFormResult にインサートするメソッドを追加します。 @PostMapping("/form/result") public String getFormResult(@ModelAttribute ContactForm form, Model model) { model.addAttribute("form", form); jdbcTemplate.update("INSERT INTO contact(name,email,message) Values(?,?,?)", form.getName(), form.getEmail(), form.getMessage()); return "result"; } フォームから送られた情報が DB に保存されます。 最後に index.html を作成して完成です。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Index</title> </head> <body> <ul> <a href="/form"><li>Form</li></a> <a href="/form/list"><li>List</li></a> </ul> </body> </html> @GetMapping("/") public String getIndex() { return "index"; } 最終的なファイルはこちらです。


Springを使ってお問い合わせフォームを作るその3

Springを使ってお問い合わせフォームを作るその3です。 今回は Spring と DB を接続して前回作成した contact テーブルの一覧を表示します。 build.gradle を開き dependencied に org.springframework.boot:spring-boot-starter-data-jpa と mysql:mysql-connector-java:8.0.20 を追加します。 implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'mysql:mysql-connector-java:8.0.20' src/main/resources/application.properties を開き、DBへの接続先情報を追加します。 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/swiswiswift-db spring.datasource.username=root spring.datasource.password=password spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver list.html を作成します。 <!DOCTYPE HTML> <html xmlns:th="https://www.thymeleaf.org"> <head> <title>Form List</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <h1>List</h1> <div> <div th:each="contact : ${contacts}"> <p th:text="'Name: ' + ${contact['name']}"></p> <p th:text="'Email: ' + ${contact['email']}"></p> <p th:text="'Message: ' + ${contact['message']}"></p> <hr> </div> </div> </body> </html> MyController にエンドポイントを追加します。localhost:8080/form/list にアクセスすると contact テーブルの一覧を取得して表示させます。


Springを使ってお問い合わせフォームを作るその1

Springを使ってお問い合わせフォームを作ります。 ユーザーがフォームにお問い合わせ内容を書いて投稿することができ、それを一覧で確認できるシステムを作ります。localhost:8080/form にアクセスするとフォームが表示され、入力後に投稿ボタンを押すとお礼メッセージと投稿内容が表示されます。 Spring Initilizer を使ってプロジェクトを作成します。 Spring Web, Spring Boot Actuator, Thymeleaf を追加し、プロジェクトを作成します。 作成したプロジェクトを IntelliJ で開き問題なく起動することを確認します。 ContactForm.java というファイルを作成します。 このファイルは Data Transfer Object(DTO)と呼ばれる種類のファイルで、ひとまとまりのデータを受け渡す時に便利なファイルです。 package com.swiswiswift.spring; public class ContactForm { private String name; private String email; private String message; public String getName() { return name; } public void setName(String name) { this.name = name; } // ...略 } form.html を作成します。localhost:8080/form へアクセスがあった場合表示されるフォームです。 <!DOCTYPE HTML> <html xmlns:th="https://www.thymeleaf.org"> <head> <title>Form</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> </head> <body> <h1>Contact Form</h1> <form action="#" th:action="@{/form/result}" th:object="${form}" method="post"> <p>Name: <input type="text" th:field="*{name}"/></p> <p>Email: <input type="text" th:field="*{email}"/></p> <p>Message: <input type="text" th:field="*{message}"/></p> <p><input type="submit" value="Submit"/></p> </form> </body> </html> MyController を作成します。localhost:8080/form へアクセスしたら form.


SwiftでSpringBootで作られたAPIに文字列を渡す

SwiftでSpringBootで作られたAPIに文字列を渡した時にちょっと詰まったのでそれの忘備録です。 @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public SampleBean request(@RequestBody String text) { SampleBean sampleBean = new SampleBean(); sampleBean.setText(text); return sampleBean; } @Data public class SampleBean implements Serializable { private String text; } このような Bean を返すエンドポイントを作りました。curl コマンドでエンドポイントを叩くと以下のようなレスポンスが返ってきます。想定通りの挙動です。 curl "http://localhost:8080/sample" \ -X POST \ -H 'Content-Type: application/json' \ -d 'Kabigon' \ | jq { "text": "Kabigon" } 次にこのエンドポイントを Swift から叩きます。 レスポンスを SampleBean にデコードしてその中の text プロパティを表示すると ダブルクオート付きの文字列が表示されてしまいます。 それはSwift がダブルクオートを含めて Spring 側にデータを送信しているからです。 Swiftが行っているリクエストを curl コマンドに翻訳すると以下になります。


SpringBootでBeanを返すとプロパティ名のisが省略される

SpringBoot で boolean型 で isXXX という名前のプロパティを持つ Bean を返すとisが省略されたので、それ周りの挙動の確認のメモです。 @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json;charset=UTF-8") public SampleBean request() { SampleBean sampleBean = new SampleBean(); sampleBean.setName("Kabigon"); sampleBean.setStudent(false); sampleBean.setIsHuman(true); return sampleBean; } @Data public class SampleBean implements Serializable { private String name; private boolean isStudent; private Boolean isHuman; } このような Bean を返すエンドポイントを作り、curl コマンドでそのエンドポイントを叩きます。 curl "http://localhost:8080/" \ -X GET \ -H 'Content-Type: application/json' \ | jq { "name": "Kabigon", "isHuman": true, "student": false } このような JSON が返ってきます。boolean型の isStudent は is が省略されています。


IntelliJでJavaのGradleのプロジェクトを作成する

IntelliJでJavaのGradleのプロジェクトを作成する方法です。 IntelliJを使うと簡単にプロジェクトを作ることができます。 build.gradle にメインクラスを指定する。 jar { manifest { attributes 'Main-Class': 'com.charalarm.batch.Main' } } $ ./gradlew build # ビルド $ ./gradlew test -i # テスト $ java -jar ./build/libs/batch-1.0-SNAPSHOT.jar com.charalarm.batch # 実行


Spring InitializrでアプリをSpringアプリを作成する

Spring Initializr でアプリをSpringアプリを作成する方法です。 Spring Initializr を使うとアプリの雛形を作ることができます。 Spring Initializr Project は Gradle、Language は Java にしました。 今回のプロジェクトは API サーバーなので、Spring Web と Spring Boot Actuator を追加しました。 html をサーバーサイドでレンダリングする場合は Thymeleaf も追加する必要があります。 Reference: Spring Initializrでアプリケーションのひな型を作成する


Java で文字列をシャッフルする

Java での文字列のシャッフル方法です。 結構面倒だったので、記事にしました。 .suffld みたいなのが欲しいです。