JAVA関連のことを調べてみた2023年11月05日

JAVA関連のことを調べてみた2023年11月05日

Udemy講座のお知らせとクーポンコードの発行(2023年11月分)

### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。
* [「マスタリング Java EE 5」(2007年)](https://amzn.asia/d/j0txqK5)
* [「アプリケーションアーキテクチャ設計パターン」(2017年)](https://amzn.asia/d/9avaCyF)

いずれも**Java EE**(**Jakarta EE**)を中心にした企業システム開発のための書籍です。中でも [「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)は、(Javaに限定されない)比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです(中級者向

元記事を表示

MyBatisでDBの共通カラムを設定する

## Aspectで値を設定する

Aspectを利用して、Mapperを実行する前にパラメータに値を設定する。
対象となるプロパティを共通仕様にして、これを拡張したものを利用すると良い。
今回は、以下のテーブル共通項目を自動で設定する仕様とする。

– 登録者
– 登録日時
– 更新者
– 更新日時
– バージョン

“`Java:MapperAspect

import java.lang.reflect.Method;
import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.Reflectio

元記事を表示

Thymeleafでセレクトボックスを独自タグで実装する

## Dialectを利用して共通のセレクトボックスを実装する

### CustomDialect

AbstractProcessorDialectを継承したCustomDialectを作成する。
StandardDialect.PROCESSOR_PRECEDENCE+1を指定することで、Thymeleafの共通タグより生成順を1つ下げている。

“`java
public class CustomDialect extends AbstractProcessorDialect {

public CustomDialect() {
super(“CustomDialect”, “item”, StandardDialect.PROCESSOR_PRECEDENCE + 1);
}

@Override
public Set getProcessors(String dialectPrefix) {
Set processors = new HashSet<>();
processors.add(new Ite

元記事を表示

webjarsでプラグインを組み込む

gradleでプラグインを組み込む方法を記載します。
以下では、Bootstrap、Bootstrap-multiselectを組み込みます。
同時にHTML上でのバージョンの指定をwebjarsに依存させるため、webjars-locatorを利用します。
プラグイン情報は以下から検索することができます。

https://mvnrepository.com/

“`gradle
implementation ‘org.webjars:webjars-locator:0.42’

implementation ‘org.webjars.bower:bootstrap:4.5.3’

implementation ‘org.webjars.bower:bootstrap-multiselect:1.1.1’
“`

Thymeleafでは、以下のようにth:srcに指定します。
ソースの場所は、Eclipseのプロジェクトの「パッケージ・エクスプローラー」上でも確認することができます。

![bootstrap.png](https://qiit

元記事を表示

Singleton作成時の注意点

– 複数のクライアントが1つの同じオブジェクト インスタンスを共有するため、無状態(stateless)に設計する必要がある。
– 特定のクライアントに依存するフィールドがあってはならない。
– なるべく読むことだけが可能でなければならない。 **値を修正してはいけない。**
– フィールド**の代わりにJavaで共有されない、ローカル変数、パラメータ、Thread Localなどを使用しなければならない。**

<問題点>
例えば、以下のように状態を維持するフィールドを作ってしまうと、
stateful Service 1 で100、stateful Service 2 で200を注文しましたが、statefulService1が200を注文したと出てくる。
“`java
package hello.hellospring.singletone;

public class StatefulService {

// 状態を保つフィールド
private int price;

public void order(String name, int price

元記事を表示

Open Libertyで管理するDataSourceをSpring BootからJNDI参照する

Open Libertyで作成・管理されているDataSourceをSpring BootからJNDIで参照してデータベース操作に利用する方法を解説します。

## 本記事で使用するコンポーネント

|コンポーネント名|バージョン|
|:–|:–|
|JDK|OpenJDK 17.0.8 (IBM Semeru Runtime Open Edition)|
|Open Liberty|23.0.0.10|
|Spring Boot|3.1.5|

“`bash
$ java -version
openjdk version “17.0.8” 2023-07-18
IBM Semeru Runtime Open Edition 17.0.8.0 (build 17.0.8+7)
Eclipse OpenJ9 VM 17.0.8.0 (build openj9-0.40.0, JRE 17 Mac OS X amd64-64-Bit Compressed References 20230718_503 (JIT enabled, AOT enabled)
OpenJ9 – d1

元記事を表示

OpenFeignで外部システムと通信する

## 目次
* [概要](#概要)
* [環境](#環境)
* [構成](#構成)
* [各種サービスの用意](#各種サービスの用意)
* [実装内容](#実装内容)
* [実行結果](#実行結果)
* [所感](#所感)
* [参考資料](#参考資料)

## 概要
OpenFeignを使用して、外部システムと通信するアプリを作る一連について記載しています。
画面については、[ChatGPT](https://openai.com/chatgpt)にベースを作成してもらい、後は頑張って[Thymeleaf](https://www.thymeleaf.org/)化しました。
ソースコードだけ見たい方は[こちら](https://github.com/he23inw3/openfeign-example)から。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534209/9ae41b31-eddd-f28e-cf95-607360e51c2e.png)

## 環境
* Kotlin

元記事を表示

【Java8→11】CookieのMax-Ageが返す値が異なる

日本語資料があまりなかったので。

JavaにはLTS(Long Term Support)というバージョンがあって、現在だとJava8, 11, 17, 21がLTSバージョンであり、サポート期間にあたります(サポート期間はディストリビューションに寄る)。そのため、Java8で動いているサービスというのも結構あります。しかし、サポート期間は無限ではないので、サポート期間のうちに最新のLTSに上げておくと、不安の種が1つ減ります。今回の話題はそんなJavaのバージョンを8から上げた時に見かけた現象を説明します。

# CookieのMax-Age

HTTPでは、サーバーとクライアントの情報のやり取りの機構の一つに[Cookie](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies)というものがあります。サーバーがクライアントにクッキーを送ると、クライアントは次のリクエストの時に送られたクッキーを送り返すことで、サーバー側はそのリクエストがどのクライアントからきたかなどを把握することができるようになります。いわゆるセッションとい

元記事を表示

プロになるJava 学習記録

# プロになるJava 学習記録
## 第5章
### BigDecimal
少しわかったような気がした。

### ChatGPTに聞いてみた内容
BigDecimalは、Javaプログラミング言語で提供されている数値データ型の一つです。BigDecimalは、浮動小数点数の精度に関する問題を解決するために使用されます。通常、浮動小数点数を使用すると、小数点以下の桁数が制限され、丸め誤差が発生する可能性があります。しかし、BigDecimalは任意の精度の数値を扱うことができます。

以下は、BigDecimalの主な特徴と使用法の要約です:

高精度: BigDecimalは、任意の桁数の整数と小数点以下の桁を保持できます。これにより、非常に精密な計算を行うことができます。

丸め誤差の回避: 通常の浮動小数点数型(floatやdouble)は、丸め誤差が生じることがあります。BigDecimalはこれを回避し、正確な計算を提供します。

精度の設定: BigDecimalは、数値を保持する際に必要な桁数を指定できます。これにより、特定の精度で数値を表現することができます。

算術

元記事を表示

Leetcode 1441. Build an Array With Stack Operations

https://leetcode.com/problems/build-an-array-with-stack-operations/description/

“`java
class Solution {
public List buildArray(int[] target, int n) {
ArrayList result = new ArrayList<>();

int index = 0;
int currNum = 1;

while (index < target.length && currNum <= n) { int num = target[index]; if(num == currNum){ index++; currNum++; result.add("Push");

元記事を表示

【Java Silver】cloneメソッドをできるだけわかりやすく解説

Javasilver se11の勉強をしていて、黒本の総仕上げ問題②74問、79問(cloneメソッドの問題)で悩んだので簡単に整理してみようと思います。記事を書くのは初めてなので、温かい目で見ていただければ幸いです。

:::note info
書き方と簡単な仕様についての解説になっています
:::
# cloneメソッドとは
その名の通り、自分のクローンを作るメソッドになっています。
コード自体はとても簡単で分かりやすいですね。
“`html:cloneメソッド
int[] a1 = {100,200};
int[] b2 = a1.clone(); //100,200が入ってる
“`
cloneメソッドはObjectクラスのサブクラス(参照型)で利用できます。
intやdoubleなどのプリミティブ型は参照を代入できず、コンパイルエラーが発生します。
“`html:コンパイルエラー
int a1 = 100;
int b2 = a1.clone(); 
“`
Object型ですが、Stringクラスでは使えずコンパイルエラーが発生します。
“`html:コンパイルエラ

元記事を表示

JavaでPDFをSVGに変換

SVGとは「Scalable Vector Graphics( 拡大縮小可能なベクター画像)」を意味し、2ビットのベクター画像用に設計されたファイル形式です。ベクターグラフィックには、鮮明さを保ちながら自由に拡大縮小できるなど、多くの利点がある。SVG、PDFはすべてベクターグラフィックスのファイル形式である。 したがって、PDFがSVGに変換されたときに、その中の要素はほとんど失われません。 この記事では、Javaプログラムで**PDFをSVGに変換**する方法を紹介します。

– **[各PDFページをSVGファイルに変換](#各pdfページをsvgファイルに変換)**
– **[すべてのPDFページを1つのSVGファイルに変換](#すべてのpdfページを1つのsvgファイルに変換)**

この記事の変換方法では、無料のAPIであるFree Spire.PDF for Javaを使用する必要があります。[Free Spire.PDF for Javaの公式ウェブサイト](https://www.e-iceblue.com/Introduce/free-pdf-for-java.ht

元記事を表示

CheerpJ 3.0rc1を発表:テストと改善にご協力ください!

![rectangle_large_type_2_4dd6199b1fa4b96b1d836a2a998a4bd1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/44102ca2-b436-0c88-a172-a20f64193c4e.jpeg)
本日、最初のCheerpJ 3.0リリース候補、バージョン3.0rc1のリリースを発表できることを嬉しく思います。

過去何年もの間、私たちのチームは、Javaアプリケーション、アプレット、ライブラリをモダンブラウザ上で実行するためのソリューションであるCheerpJのために、全く新しいアーキテクチャの開発に精力的に取り組んできました。

# 主なハイライト
世界中の何百もの組織による長年のCheerpJ 2.xの実世界での利用を活用し、我々のブラウザベースのx86仮想マシンであるCheerpXの開発から学んだ多くの教訓を活用して、我々はCheerpJの全面的な書き直しを行いました。

* さようならAOT、こんにちはJITコンパイル: Che

元記事を表示

デザインパターン Stateパターン

# Stateパターン
オブジェクト指向プログラミングでは、人や物をオブジェクトとして表現する。

Stateパターンでは、**「状態」をオブジェクトで表現する**。

状態は`State`クラスとして表現され、`Context`クラスが保持し、その状態に基づく振る舞いをする。

状態遷移(次にどの状態へなるか)は、各`State`オブジェクト自身が知っている(設計方法により、`Context`オブジェクトが管理する場合もある)。

Stateパターンは、オブジェクトの振る舞いがその「状態」に依存し、状態が変化することで振る舞いも変わる場合に有用。このパターンを使用すると、状態に基づく条件文(if-elseなど)を減少させ、コードの保守性と拡張性を向上させることができる。

## シチュエーション
エアコンで温度の状態「低」「中」「高」を管理するものとする。

## Stateパターンを使用しない場合
状態をクライアント自身が管理している。

状態が増えるたびにクライアント側のコードの修正が必要。

状態の追加や変更に対して柔軟性が低い。

“`java:Main.java
// ク

元記事を表示

Spring Boot + Spring Data JPAは3.1.xだと動かないかもしれない

## 概要と結論の先出し
2023-11-24でSpring Boot2.7.xおよび3.0.xがサポート終了となりバージョンアップが必要となります。

ところがSpring Data JPAを選択しているアプリケーションの場合、3.1.xにバージョンアップすると、依存しているHibernate6.2.xにバグがあるためコードを改修しないと動かないかもしれません。
**Hibernate6.2(とそれに依存するSpringのバージョン)は使用するべきではない** と思われます。
いくつかの条件がわかりましたので、原因と回避策について共有します。

## 発生する事象
アプリケーションの起動させるとHibernateの初期化中にエラーが発生し、起動できない状態になります。下記はエラーの1例です。発生するエラーは他のエラーもあり得ます。

“`
java.lang.ClassCastException: class org.hibernate.mapping.BasicValue cannot be cast to class org.hibernate.mapping.ToOne

元記事を表示

Spring BootでExcel作成

## 概要

ApachePoiを利用してExcelファイル出力を行う。
通常はAbstractXlsxViewを継承したクラスを作成して、Excel出力を行う。
ただこの場合、レスポンスを返すときにExcelを作成しているので、出力に失敗した場合にController上でハンドリングできない。
以下では、AbstractViewを継承して、一部AbstractXlsxViewを踏襲したクラスを作成する。
またxlsにも対応させ、テンプレートのExcelファイルがある場合はこれも利用できるようにして、汎用的なクラスにしている。

## AbstractXcelView

“`Java
public abstract class AbstractXcelView extends AbstractView {

protected String templateFile;

private Workbook workbook = null;

public void createWorkbook(Map model, HttpServletReque

元記事を表示

FutureオブジェクトをCompletableFutureオブジェクトに変換する

Java5で追加されたFutureクラスは、未完了かもしれない非同期処理の結果を保持するクラスですがget()メソッドがあって完了までブロックするだけという低機能なものです。.thenなんちゃら() みたいな、完了時のコールバックを与えるということができません。これは非常に不便。

完了時のコールバックを .then 系メソッドで与えられるようになったのはJava8で登場したCompletableFutureクラスです。

では、CompletableFutureのように完了時コールバックを差し込みたいのに手元に受け取ったのがFutureオブジェクトだった場合はどうすればいいでしょう?

こんな簡単なコードで変換できます。

“`java
Future f = …
CompletableFuture cf = CompletableFuture.supplyAsync(f::get);
“`

元記事を表示

JavaSilverの試験で多分問われない演算子の話①

# はじめに
JavaSilverの黒本や紫本で下記のような図があり、個人学習でも実務でも出会ったことがなかった演算子があったのでまとめていきます。

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/749c9147-292d-bdcf-09d2-d89829ce2554.jpeg)

ちなみにJavaSilverの試験対策として問題をいくつか解きましたが、
筆者は本記事で紹介する演算子が登場する問題は見たことがありません。
そのため、知らなくても合格はできるはず。

# ビットを反転する演算子「~」
単項演算子のひとつ。
ビットを反転してくれます。
基本情報を学習したことがある人は思い出して欲しいのですが、
ビット反転とは「0」のものを「1」に。
もしくは逆のことを行います。
例えば、「1010」なら「0101」になります。

“`java:Hanten1.java

public class Hanten1
{
public static void ma

元記事を表示

【Android Studio】コピペで使えるWebViewの導入方法

# はじめに
Android StudioでWebViewを使いたいけど、使い方がよくわからないという人向けにコピペで使えるWebViewの導入方法を作成しました。本記事通りに作業を進めることで、Androidアプリ上でGoogle.comを開くことができます(言語はjavaを使用しています)。

# 導入方法

New Project -> Empty Views Activityを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/02601b1b-4ff8-d316-763e-f9f00580fa16.png)

以下の通りプロジェクト作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/d7b2b161-91c9-a5bd-de95-cb8f7ccfa67e.png)

res/layout/activity_main.xmlを以下の通り編集(画面上部

元記事を表示

SpringBoot でファイルダウンロード

SpringBootにて、ファイルをダウンロードするユーティリティメソッドを作ったのでメモとして残します。
引数は、ダウンロード対象のファイルパス、出力ファイル名、HttpServletResponseです。
Controllerの引数でHttpServletResponseを読み込むことで、これを利用することができます。

“`Java
/**
* ファイルダウンロード
*
* @param originFilePath ダウンロードファイルパス
* @param outputFileName 出力ファイル名
* @param response HttpServletResponse
*/
public static void downloadFile(String originFilePath, String outputFileName, HttpServletResponse response) {
String CONTENT_DISPOSITION_FORMAT = “attachment; filename=\”%

元記事を表示

OTHERカテゴリの最新記事