Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

実装例にオリジナルの仕様を追加 #1

Open
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

dai-fuji
Copy link
Owner

@dai-fuji dai-fuji commented Jul 2, 2022

アレンジした内容

  1. idとnameのマップを作成し、idをクエリ文字列として使用し、該当のnameを返す。
  2. マップfruitsを作成し、priceMin(価格下限)をクエリ文字として使用し、priceMinよりも高価な果物を返す。
  3. 上記2点それぞれのクエリ文字列にバリデーションをかける。

以下2の実行結果を抜粋。

0円より高価な果物を抽出
❯ curl --location --request GET 'http://localhost:8080/fruit?priceMin=0' -i
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 02 Jul 2022 08:06:28 GMT

["grape","orange","apple"]%


500円より高価な果物を抽出
❯ curl --location --request GET 'http://localhost:8080/fruit?priceMin=500' -i
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 02 Jul 2022 08:06:58 GMT

["grape"]%

10000円より高価な果物を抽出 ※4桁までしか入力できないようにバリデーションをかけているためエラー
❯ curl --location --request GET 'http://localhost:8080/fruit?priceMin=10000' -i
HTTP/1.1 500
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sat, 02 Jul 2022 08:07:31 GMT
Connection: close

{"timestamp":"2022-07-02T08:07:31.430+00:00","status":500,"error":"Internal Server Error","path":"/fruit"}%

public class DemoController {

@GetMapping("/names")
public List<String> getName(){
return List.of("Ichiro","Jiro", "Saburo");
public String getName( @RequestParam("id") @Pattern (regexp = "^[1-3]$" ) String id) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

badge
たいしたことではないのですが、フォーマットはこのようにするのがbetterです。

Suggested change
public String getName( @RequestParam("id") @Pattern (regexp = "^[1-3]$" ) String id) {
public String getName(@RequestParam("id") @Pattern(regexp = "^[1-3]$") String id) {

public List<String> getName(){
return List.of("Ichiro","Jiro", "Saburo");
public String getName( @RequestParam("id") @Pattern (regexp = "^[1-3]$" ) String id) {
Map<Integer, String> namesById = Map.of(1,"Ichiro",2, "Jiro",3,"Saburo");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super badge

Suggested change
Map<Integer, String> namesById = Map.of(1,"Ichiro",2, "Jiro",3,"Saburo");
Map<Integer, String> namesById = Map.of(1, "Ichiro", 2, "Jiro", 3, "Saburo");


@GetMapping("/fruit")
public List<String> getFruitList(@RequestParam("priceMin") @Pattern (regexp = "^[0-9]{1,4}$" ) String priceMin) {
Map<String, Integer> fruits = Map.of("apple",100,"orange", 150,"grape",1000);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mapの変数名は
keyToValue
valueByKey
のような形式がよいですね。

fruitsToPriceとかでしょうか。

}
});
if (fruitsFilterByPrice.isEmpty()){
return null;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

空ならば[]を返すようにしてもいいかと思います。
Collections.emptyList()的なものがあったはず。
もしくはfilterした結果をそのまま返せばよいですね。

Integer priceMinToInt = Integer.valueOf(priceMin);
List<String> fruitsFilterByPrice = new ArrayList<>();

fruits.forEach((fruitName, fruitPrice) -> {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Streamのfilter使ってみるとよいです。

@yoshi-koyama
Copy link

yoshi-koyama commented Jul 2, 2022

こちら対応あとでよいです↓

10000円より高価な果物を抽出 ※4桁までしか入力できないようにバリデーションをかけているためエラー

こちらですがレスポンスのステータスコードが500になります。
ただ、バリデーションエラーはクライアント側の問題なので本来的には400で扱うのが適切です。

なんでこうなっているの?と思うはずですが、Spring FrameworkのGitHubのIssueでも話が上がっていますね。
spring-projects/spring-boot#10471
spring-projects/spring-framework#11041
↑最後のAny Progress??に笑いました。 👍 ついているし。

じゃあ、どう実装するかですが、このあたりが参考になると思います。

https://www.baeldung.com/spring-boot-bean-validation
https://www.baeldung.com/spring-response-status

ただし、こちら優先度は落としてもらっていいです。
まずはMyBatisを使ってDBとの接続をやりましょう。

return namesById.get(Integer.valueOf(id));
}

@GetMapping("/fruit")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

複数の果物が返却されるのが予想できるのでfruitsがよいですね。

@dai-fuji
Copy link
Owner Author

dai-fuji commented Jul 3, 2022

@yoshi-koyama

ステータスコード対応を除き、いただいた指摘事項対応しました。
e45fb69

  • SaveActionsの設定をしておらず、フォーマットが統一されておりませんでした。
    この設定はプロジェクトごとに毎度実施するのは通常ですか?ざっとググった感じだと見つけることができなかったのですが、グローバルな設定として登録するなどの方法はないのでしょうか?
  • mapでstreamの利用するのにentrySet()?setクラス?という感じなので、復習します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants