質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

3回答

1200閲覧

springbootで「実引数リストと仮引数リストの長さが異なります」

kissy

総合スコア17

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/01/12 13:53

前提・実現したいこと

RestAPIの勉強中です。
エラーメッセージをカスタマイズしたいと思い、以下のリンク先を参考にして書いてみたのですが、エラーが発生しています。

参考先:https://qiita.com/YutaKase6/items/434d36901e3a3360e9b0

書籍やネットの情報を参考にしつつ、エラーメッセージの内容は理解できたと思うのですが、具体的にどのように解決すればいいのかわからず…。
アドバイスをお願いします。

発生している問題・エラーメッセージ

Error:(18, 22) java: クラス com.example.restapi.error.ErrorResponse.Errorのコンストラクタ Errorは指定された型に適用できません。 期待値: 引数がありません 検出値: java.lang.String,java.lang.String,java.lang.String 理由: 実引数リストと仮引数リストの長さが異なります

該当のソースコード

ErrorResponse.java

1package com.example.restapi.error; 2 3 4import com.fasterxml.jackson.annotation.JsonProperty; 5import lombok.Value; 6 7@Value 8public class ErrorResponse{ 9 @JsonProperty("Error") 10 private Error error; 11 12 public ErrorResponse(String message, String detail, String code){ 13 this.error = new Error(message,detail,code); 14 } 15 16 @Value 17 private class Error{ 18 @JsonProperty("Message") 19 private final String message; 20 @JsonProperty("Detail") 21 private final String detail; 22 @JsonProperty("Code") 23 private final String code; 24 } 25}

補足情報(FW/ツールのバージョンなど)

使用しているツールなど
・IntelliJ IDEA
・Spring Boot(gradle/lombok)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Errorクラスに付いているValueアノテーションはLombokというライブラリの機能ですが、このアノテーションを付けると、引数を伴うコンストラクタが自動的に生成されます。(ソースコード上は見えませんが、delombokで確認すると下記のようなコードが生成されています)

java

1@java.beans.ConstructorProperties({"message", "detail", "code"}) 2public Error(String message, String detail, String code) { 3 this.message = message; 4 this.detail = detail; 5 this.code = code; 6}

コンストラクタに関するエラーメッセージが表示されていることから、lombokが機能していない可能性がありますので、まずは開発環境(Intellij)やプロジェクトでlombokが有効になっているかご確認ください。

確認する点として

  1. IntelliJにlombokプラグインがインストールされていて有効になっているか
  2. Intellijのコンパイルの設定で、Annotation Processorが有効になっているか
  3. Mavenを使われていると仮定して、pom.xmlにlombokが依存関係として追加されているか

が考えられます。

1つ目は、Intellijのメニューバー → File → Settings → 検索フィールドに"lombok"と入力し、pluginsにLombok Pluginがあり、且つチェックが付いていること。

2つ目は、Intellijのメニューバー → File → Settings → 検索フィールドに"annotation processors"と入力し、Compiler > Annotation Processors画面の"Enable annotation processing"にチェックが付いていること。

3つ目は、pom.xmlファイルを開き下記のような記述が見つかること。

xml

1<dependency> 2 <groupId>org.projectlombok</groupId> 3 <artifactId>lombok</artifactId> 4 <optional>true</optional> 5</dependency>

lombokについては、"java lombok"等のキーワードで検索すると分かりやすい記事が見つかると思いますので一度しらべてみてください。
なお、Rest APIを勉強するにあたってlombokの知識は必須ではないので、面倒なようでしたらlombokは使わずに、他の回答にあるようにコンストラクタを自前で実装してみるのもいいと思います。
(lombokを使うと記述するコード量が減るというメリットがありますが、勉強段階では逆にデメリットになるかもしれません。)

投稿2019/01/13 02:53

rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2019/01/13 03:07

そういう機能があるんですね。質問者ではないですが、勉強になりました。
kissy

2019/01/13 05:21

おかげさまで解決しました。結果的に言うと、Annotation Processorが有効になっていなかったことが問題でした。 ですがおっしゃる通り、APIの勉強目的ならlombokに頼らず自力でコードを書いた方が良さそうです。ありがとうございました!
guest

0

まずソースを見た限りErrorクラスにコンストラクタがありません。
その場合、Error()というコンストラクタが指定される、というJavaの仕様があったはずです。
なので、どのような処理かはわかりませんが、

Error( String arg1, String arg2, String arg3 ) { }

のようにすると、とりあえず解決するかと。

投稿2019/01/12 23:57

yukkuri

総合スコア624

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kissy

2019/01/13 05:14

ありがとうございます。おっしゃる通りコンストラクタそのものがなかったのですね。今回の場合は、lombokを利用して作成しようとしていたのですが、lombokが有効になっていなかったことが問題でした。
guest

0

Errorクラスで、引数のあるコンストラクタを呼べていないのだと思います。

@Value private class Error{ private final String message; private final String detail; private final String code; //Errorクラスのコンストラクタ public Error (String message,String detail,String code){ this.message = message; this.detail = detail; this.code = code;   }

コンストラクタで何を実行するのかは分かりませんが、message,detail,codeを宣言していて
newするときに引数を記述しているのでおそらくこんな感じのコンストラクタが本来あるのだと思います。

違ってたらごめんなさい

投稿2019/01/12 18:17

Kota_Kappa

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kissy

2019/01/13 05:12

ありがとうございます。おっしゃる通り、本来はErrorクラスのコンストラクタがあるのですよね。今回の場合、lombokを利用してコンストラクタの生成を行なっていたのですが、lombokが有効になっていなかったのでコンストラクタが生成されず、エラーになっていたようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問