■処理概要
指定するURLに応じてそれぞれのプロパティファイルから値を取得する。
URLとプロパティファイルの紐付けは以下の通り。
| URL | プロパティファイル名 | 
|---|---|
| /rest/sample/a | sampleA.properties | 
| /rest/sample/b | sampleB.properties | 
| /rest/sample/c | sampleC.properties | 
「/rest/sample/[a, b, c以外]」が指定された場合は、URLの指定が誤りである旨を通知する。
また上記に共通する値については、「sampleCommon.properties」にて管理するものとする。
▼応答メッセージ仕様
応答メッセージに出力する内容と、対応するプロパティファイルの表を以下に示す。
| 応答項目 | プロパティファイル名 | 備考 | 
|---|---|---|
| header | sampleCommon.properties | |
| title | sampleA.properties sampleB.properties sampleC.properties | 「/rest/sample/[a, b, c以外]」が指定された場合は、s指定しない。 | 
| data | sampleA.properties sampleB.properties sampleC.properties | 「/rest/sample/[a, b, c以外]」が指定された場合は、s指定しない。 | 
| value | sampleA.properties sampleB.properties sampleC.properties | 「/rest/sample/[a, b, c以外]」が指定された場合は、s指定しない。 | 
| message | sampleA.properties sampleB.properties sampleC.properties | 「/rest/sample/[a, b, c以外]」が指定された場合は、URLの指定が誤りである旨を通知する。 | 
▼Java・Spring Bootのバージョン
実装するJavaおよびSpring Bootのバージョンは以下の通り。
| 項目 | バージョン | 
|---|---|
| Java | 17 | 
| Spring Boot | 3.4.2 | 
■クラス図
実装するモジュールのクラス図を以下に示す。

■プロパティファイルの設定値
各プロパティファイルに設定する値は以下の通り。
・sampleCommon.properties
sample.common.header=sample common header・sampleA.properties
sample.a.title=sample A
sample.a.data=hoge A
sample.a.value=1
sample.a.message=OK・sampleB.properties
sample.b.title=sample B
sample.b.data=hoge B
sample.b.value=2
sample.b.message=OK・sampleC.properties
sample.c.title=sample C
sample.c.data=hoge C
sample.c.value=3
sample.c.message=OK各プロパティファイルの配置場所は以下の通り、「resources/conf」配下とする。

■pom.xmlの設定
pom.xmlの設定は以下の通り。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.4.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>get-properties-data</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>get-properties-data</name>
	<description>get data from property files.</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>
■サンプルコード
実装するモジュールのサンプルコードを以下に示す。
・GetPropertiesController
package com.example.get_properties_data.controller;
import com.example.get_properties_data.dto.PropertiesDTO;
import com.example.get_properties_data.service.RestPropertiesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GetPropertiesController {
  @Autowired
  private RestPropertiesService restPropertiesService;
  @GetMapping("/rest/sample/{param}")
  public PropertiesDTO getPropertiesData(@PathVariable String param) {
    return restPropertiesService.getPropertiesDTO(param);
  }
}
・RestPropertiesService
package com.example.get_properties_data.service;
import com.example.get_properties_data.dto.PropertiesDTO;
import java.util.Map;
public interface RestPropertiesService {
  // propertiesの値を取得
  public PropertiesDTO getPropertiesDTO(String params);
}
・RestPropertiesServiceImpl
package com.example.get_properties_data.service;
import com.example.get_properties_data.config.GetSampleAConfig;
import com.example.get_properties_data.config.GetSampleBConfig;
import com.example.get_properties_data.config.GetSampleCConfig;
import com.example.get_properties_data.dto.PropertiesDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class RestPropertiesServiceImpl implements RestPropertiesService {
  @Autowired
  private GetSampleAConfig getSampleAConfig;
  @Autowired
  private GetSampleBConfig getSampleBConfig;
  @Autowired
  private GetSampleCConfig getSampleCConfig;
  @Value("${sample.common.header}")
  private String header;
  /**
   * プロパティ情報取得処理 URLに応じてプロパティの値をセットする
   *
   * @param params: URL:a, b, c, other
   * @return PropertiesDTO
   */
  @Override
  public PropertiesDTO getPropertiesDTO(String params) {
    // 返却用DTO
    PropertiesDTO resultDTO = null;
    // paramごとにプロパティをセットする
    if ("a".equals(params)) {
      resultDTO = getSampleAConfig.setPropertiesSampleADTO();
    } else if ("b".equals(params)) {
      resultDTO = getSampleBConfig.setPropertiesSampleBDTO();
    } else if ("c".equals(params)) {
      resultDTO = getSampleCConfig.setPropertiesSampleCDTO();
    } else {
      resultDTO = setOthers();
    }
    // 共通のヘッダ情報をセットする
    resultDTO.setHeader(header);
    return resultDTO;
  }
  /**
   * プロパティ情報その他のセット処理 - NGのメッセージをセットする
   *
   * @return PropertiesDTO
   */
  private PropertiesDTO setOthers() {
    PropertiesDTO others = new PropertiesDTO();
    // メッセージにNG情報をセット
    others.setMessage("NG: Please choose a, b, or c in URL.");
    return others;
  }
}
・GetSampleAConfig
package com.example.get_properties_data.config;
import com.example.get_properties_data.dto.PropertiesDTO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:conf/sampleA.properties")
public class GetSampleAConfig {
  @Value("${sample.a.title}")
  private String titleA;
  @Value("${sample.a.data}")
  private String dataA;
  @Value("${sample.a.value}")
  private String valueA;
  @Value("${sample.a.message}")
  private String messageA;
  /**
   * プロパティサンプルA読み込み処理
   *
   * @return PropertiesDTO
   */
  public PropertiesDTO setPropertiesSampleADTO() {
    PropertiesDTO propertiesData = new PropertiesDTO();
    propertiesData.setTitle(titleA);
    propertiesData.setData(dataA);
    propertiesData.setValue(Integer.parseInt(valueA));
    propertiesData.setMessage(messageA);
    return propertiesData;
  }
}
・GetSampleBConfig
package com.example.get_properties_data.config;
import com.example.get_properties_data.dto.PropertiesDTO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:conf/sampleB.properties")
public class GetSampleBConfig {
  @Value("${sample.b.title}")
  private String titleB;
  @Value("${sample.b.data}")
  private String dataB;
  @Value("${sample.b.value}")
  private String valueB;
  @Value("${sample.b.message}")
  private String messageB;
  /**
   * プロパティサンプルB読み込み処理
   *
   * @return PropertiesDTO
   */
  public PropertiesDTO setPropertiesSampleBDTO() {
    PropertiesDTO propertiesData = new PropertiesDTO();
    propertiesData.setTitle(titleB);
    propertiesData.setData(dataB);
    propertiesData.setValue(Integer.parseInt(valueB));
    propertiesData.setMessage(messageB);
    return propertiesData;
  }
}
・GetSampleCConfig
package com.example.get_properties_data.config;
import com.example.get_properties_data.dto.PropertiesDTO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:conf/sampleC.properties")
public class GetSampleCConfig {
  @Value("${sample.c.title}")
  private String titleC;
  @Value("${sample.c.data}")
  private String dataC;
  @Value("${sample.c.value}")
  private String valueC;
  @Value("${sample.c.message}")
  private String messageC;
  /**
   * プロパティサンプルC読み込み処理
   *
   * @return PropertiesDTO
   */
  public PropertiesDTO setPropertiesSampleCDTO() {
    PropertiesDTO propertiesData = new PropertiesDTO();
    propertiesData.setTitle(titleC);
    propertiesData.setData(dataC);
    propertiesData.setValue(Integer.parseInt(valueC));
    propertiesData.setMessage(messageC);
    return propertiesData;
  }
}
・GetSampleCommonConfig
package com.example.get_properties_data.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
 * プロパティサンプル共通読み込みクラス
 */
@Configuration
@PropertySource("classpath:conf/sampleCommon.properties")
public class GetSampleCommonConfig {
}
・HealthCheckDTO
package com.example.get_properties_data.dto;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class PropertiesDTO {
  private String header;
  private String title;
  private String data;
  private int value;
  private String message;
}
■実行結果
・「/rest/sample/a」の場合
{
    "header": "sample common header",
    "title": "sample A",
    "data": "hoge A",
    "value": 1,
    "message": "OK"
}・「/rest/sample/b」の場合
{
    "header": "sample common header",
    "title": "sample B",
    "data": "hoge B",
    "value": 2,
    "message": "OK"
}・「/rest/sample/c」の場合
{
    "header": "sample common header",
    "title": "sample C",
    "data": "hoge C",
    "value": 3,
    "message": "OK"
}・「/rest/sample/s」の場合(a, b, c以外のケース)
{
    "header": "sample common header",
    "title": null,
    "data": null,
    "value": 0,
    "message": "NG: Please choose a, b, or c in URL."
}


コメント