親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

Java

Javaのファイル読み込みメソッドを整理

ファイルを読み込む処理 例えばcsvファイルなど、ファイルの内容を読み込んで処理をすることがありますよね。そんな時にFileInputStreamやらInputStreamReaderやらBufferedReaderを使う必要があるのですが、初見だと何がなにやらさっぱりですよね。そんなメ…

Spring Bootの起動が遅いので試行錯誤した話

コンパイル言語の宿命 Spring Bootに限らずJava等コンパイル言語の宿命ですが、ちょっとした変更でもいちいちコンパイルが必要になりますよね。 そうして開発効率の悪さを感じてしまいます。 ※もちろんコンパイル言語は実行時のパフォーマンスに安定感がある…

Spring Boot のCORS対策

CORSとは? 通常Webページでは、同一生成元ポリシー(Same Origin Policy)によってWebページを生成したドメイン以外へのHTTPリクエストができません。 しかし、外部リソースから情報を取得してページ内で表示したいというニーズは当然のようにあり、CORSとい…

SpringBootのFormバリデーションで、Listを使って別々の項目に同じチェック

SpringBootのFormで使われるList SpringBootのFormバリデーションで独自バリデーションを作成し、 適用している人にとってはよく見かけるListですが、これの使い道は知ってますか?例) public @interface List { TestValidate[] value(); } 一例ですが、例…

Entityの@ManyToOneでCascadeオプションの使い道

Entityの@ManyToOne あるEntity(エンティティ)に対してフィールドを設定した時に、 Entityとフィールドが多対一の関係にある時に使用します。 このあたりの説明は長くなるので、詳細を知りたい人はぐぐって調べてみてください。ただ@ManyToOneを付けるだけ…

AWSでのメール送信でタイムアウトが頻繁に発生

SpringBoot + EC2の構成で、メール送信エラーが頻発 SpringBoot + EC2のアプリケーションでメルマガ機能を作成していましたが、どうにもメール送信が途中で止まってしまうということで、ログを確認すると以下のようなエラーログが頻発していました。 要はタ…

@Columnのlengthやnullableでエラー検知してくれない

Spring Bootのバリデーション Spring Bootでは、フォームやエンティティクラスにおいて、アノテーションによる入力値チェックが可能なことはご存知でしょう。一応このブログ内でもフォームのバリデーションについては記しているので参考までにSpring BootでB…

Spring BootをIDEを使わずコマンドで実行

開発環境でのSpring Bootの実行 でも記載している通り、Spring Bootは開発環境だとIDEなどで簡単に設定することが可能です。 ちょっとの設定でいつでも停止や実行ができるので楽ですよね。 ブレークポイントで止めながらデバッグをしたい場合にも便利です。…

Tomcatのログファイルを整理せよ!

Tomcatのデフォルトのログ設定 タイトルの通りですが、今回はTomcatのログファイルに関する設定についてです。 Tomcatはデフォルトの設定のままでは多くのログファイルを出力します。 ただ、中には運用上不要なものが多く、ログを出しっぱなしだとファイル数…

Spring Data JPAでパラメータ以外でコロンを使いたい

RepositoryにSQLを直接記入 Spring Data JPAでORマッパーでは書けないようなSQLを実行したい場合、Repositoryに直接構文を書きますよね。 そんな時、パラメータで変数の値を渡したい時はコロンで変数を指定しますよね。 例えば以下のidのように @Query(value…

Spring Data JPA のfind+OrderByで、No property desc foundエラー時の対処法

Spring Data JPAでのOrderBy Spring Data JPAでエンティティクラスにfindして複数のレコードを取得する場合、OrderByをつければ並び順を変更できることはご存知でしょうか? findByNameOrderById(Spring name) などとすれば、nameで絞り込んだ上で、idの降順…

Spring Bootで実行SQLのログを取得する方法

アプリケーション開発でのSQLログ アプリケーションの開発をしている時、実行されたSQLのログを参照したい場面がありますよね。 想定外のSQLが実行されていないか確認したり、ボトルネックとなっているSQLを確認したりなど。 Spring BootではそのようなSQLの…

Spring BootでEntityオブジェクトのクローンをしてみる

Entityオブジェクトのクローン SpringBootで機能の実装をしている中で、Entityオブジェクトのクローンを作りたくなることはありませんか?例えばコピー機能などを想像してみてください。 いちいちオブジェクトをnewして、同じ値を全てsetして保存する...そん…

SpringBootでローカルjarファイルをMavenで管理

ローカルjarファイルはどんな時に使う? 普段SpringBootで外部ライブラリを使う時、Mavenの設定ファイルであるpom.xmlを使う人が多いのではないでしょうか。Mavenのリポジトリにあり、誰でもインストールして使えるライブラリだとそのやり方で問題ないのです…

Spring Boot + MySQLで絵文字を保存する

絵文字を保存したい スマホが普及してから絵文字を文中に入れるのはもはや普通のことですよね。 掲示板などでも絵文字を入力できるものは増えていますよね。Webアプリの開発者の中には絵文字を入力できるフォームを作りたいという人もいるのではないでしょう…

Spring BootのFormクラスでIntegerの項目にNULLはPOSTできない

NULLをPOSTした時点でStringとして認識されてしまう Spring Bootにおけるフォームから値をPOSTする際の挙動になりますが、Integer型の変数にNULLを送信すると以下のようなエラーが発生してしまいます。 Failed to convert property value of type 'java.lang…

NginxとTomcatでリバースプロキシ連携

なぜNginxとTomcatを連携? Javaを動かす際のサーバ(ミドルウェア)としてTomcatはよく使われると思いますが、元々Java以外の言語を扱っていた方などは、Webサーバとしての細かい設定はApacheやNginxの方が慣れている場合がありますよね? そんな時はURLから…

TomcatのインストールとCATALINA_OPTSの設定

Tomcatのインストールの仕方でCATALINA_OPTSの設定方法も異なる Java Servlet を動かすために必要なコンテナとしてよく使用されているTomcatですが、Linux環境にインストールする方法としては大きく2つあります。 それぞれの違いはご存知ですか? インストー…

ApacheとTomcatの連携でリダイレクトが上手くいかない

Javaで組まれたWebサイトをApacheとTomcatを連携させて動かしているのですが、 先日サイト改修により一部ページのURLも変更させた時のリダイレクト設定について苦労したのでそれについて書きます。 やりたいことは、「http://ドメイン/test/sample.html」と…

Spring Boot Devtoolsを使って自動再起動

Javaなどソースの変更をいちいちコンパイルをして確認する場合、 毎回コンパイルを手動でするのは面倒ですよね。 (慣れている人は何も感じないかもしれませんがw)Spring Bootでは自動でコンパイルをしてくれるツールがあるので、 少しは開発効率を上げるこ…

Spring Boot のJavaバージョンを変更

Intellijなど、IDEで開発する場合はJDKをインストールして使うので問題ないと思いますが、 本番環境にアップした場合などにJavaのバージョンを指定しておかないと開発環境で開発した通りに動作してくれないなどの問題が発生してしまいます。変更箇所はpom.xm…

Spring Bootの起動時にJDKのエラー(警告)が発生

Javaの一部JDKのバージョンでは、 Spring Bootの起動時に以下のエラー(警告)が発生することがあります。 /Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home/bin/java ... objc[3929]: Class JavaLaunchHelper is implemented in both /Libr…

@PathVariableを必須にしない

Spring BootのGETリクエストでパラメータを設定した時、 パラメータを取得するには@PathVariableを使います。例えば以下のような@RequestMappingがあった場合、idは必須になります。 @RequestMapping(value="top/{id}", method = RequestMethod.GET) String …

Spring BootでBean Validation (3) バリデーション処理を自作

ti-tomo-knowledge.hatenablog.com ti-tomo-knowledge.hatenablog.com上記2つのような流れで、BeanValidationにおける基本的なバリデーションの流れを見ていきましたが、 これらはあくまでBeanValidationやHibernateで事前に用意されたものです。 実際にサー…

Spring BootでBean Validation (2) エラーメッセージの多言語化

まずはti-tomo-knowledge.hatenablog.comを参考にしてmessage.propertiesを使って多言語化する流れを見てほしいです。 これを使えばバリデーション時のエラーメッセージの対応もすぐできます。Bean Validation のアノテーションは、通常messageというパラメ…

Spring Boot Thymeleafで多言語化

多言語対応でサイトを作ることが多い現代だからなのか、 最近のフレームワークは多言語対応がとても簡単です。ここではThymeleafに表示される文字を多言語対応する方法を共有します。 基本的にはmessages_ja.propertiesや、messages_en.propertiesというよう…

Spring BootでBean Validation (1) @GroupSequenceで順番にチェック

Spring Bootでは(Spring Boot以外にもBean Validation使ってるやつ全部ですが)、Serializableクラスに対して 「org.hibernate.validator.constraints」や「javax.validation.constraints」を使って、 @NotEmptyや@Sizeといったようにアノテーションを使うだ…

PHPとJavaのthis事情

プログラムを始めたばかりの人は、 ある程度の規模のソースを書くまでthisの意味を理解するのが大変ですよね。 PHPもJavaもthisの使い方は基本的には同じで、 あるクラスのメンバ変数やメソッドを指定する時に使います。 ちょっと違う点としては、Javaの方は…

JavaEE7でHello, World

ti-tomo-knowledge.hatenablog.comでJFSを使ったFaceletsについて書きましたが、ここからは具体的にFaceletsを使った動作確認をしてみたいと思います。 まずは簡単に「Hello, World」の出力からです。 どこをググってもEclipseを使ったものの説明が多いので…

JSPはもう古い?Faceletsとは

8年くらい長い間JavaEEに触れてこなかったのですが、 最近触れてみるとかなり技術が変化していて驚きました。特に昔はJSPでビュー側を書いていたのに、最近ではFaceletsというものが出てきて いわゆるxhtml形式で書くのが主流になってきているんですね。 自…