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

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

ただいまの
回答率

87.49%

java(SpringBoot)でのmap配列呼び出しに困っています.

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 318

score 15

課題でJavaのSpringBootでPostgreSQLのデータを扱っていますが,エラーがこのように文字化けしており解決方法が分かりません.

     displaylist.put(PostgreSQLJDBC.getList(shopid));
                   ^
  ���Ғl: List<Shop>,List<Staff>
  ���o�l:    Map<List<Shop>,List<Staff>>
  ���R: ���������X�g�Ɖ��������X�g�̒������قȂ�܂�
  K,V���^�ϐ��̏ꍇ:
    �C���^�t�F�[�X Map�Ő錾����Ă���K extends Object
    �C���^�t�F�[�X Map�Ő錾����Ă���V extends Object

具体的なコードとしては,

package com.example.********;//伏せ字.動作確認済

import java.sql.*;
import java.util.*;

public class PostgreSQLJDBC {

    //public static void main(String args[]) {

    public Map<List<Shop>,List<Staff>> getList(String shopId){
        List<Shop> displayShop = new ArrayList<Shop>();
        List<Staff> displayStaff = new ArrayList<Staff>();

        Connection c = null;
        Statement stmt = null;
        try {
            Class.forName("org.postgresql.Driver");
            c = DriverManager.getConnection("jdbc:postgresql://*****","****","*****");
            //URL,username,passwordを伏字にしておりますがSQL文実行やmap生成まで接続確認済みです.
            stmt = c.createStatement();

            String sql = "SELECT shop.shop_id, shop_name, staff_id, first_name, last_name ";
            sql += " FROM shop JOIN staff ";
            sql += " ON shop.shop_id=staff.shop_id WHERE staff.shop_id="+shopId;
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                Shop shop = new Shop();
                Staff staff = new Staff();

                //Long shopId = rs.getLong("shop_id");
                String shopName = rs.getString("shop_name");
                long staffId = rs.getLong("staff_id");
                String firstName = rs.getString("first_name");
                String lastName = rs.getString("last_name");

                shop.setShopId(java.lang.Long.parseLong(shopId));
                shop.setShopName(shopName);
                staff.setStaffId(staffId);
                staff.setShopId(java.lang.Long.parseLong(shopId));
                staff.setFirstName(firstName);
                staff.setLastName(lastName);

                displayShop.add(shop);
                displayStaff.add(staff);
            }
            rs.close();


            stmt.close();
            c.close();

        } catch (Exception e) {
            System.err.println(e);
        }

        Map<List<Shop>,List<Staff>> ssList = new HashMap<List<Shop>,List<Staff>>();
        ssList.put(displayShop,displayStaff);
        return ssList;
    }
}


で生成されるShopクラスとStaffクラスのmapの配列を,

package com.example.********;//伏せ字.動作確認済

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;



@RestController
public class ShopController {
    /*@GetMapping("/shop")
    public Map<List<Shop>,List<Staff>> getList(@RequestParam(id = "id") String id) {
        return getList(id);
    }*/

    @GetMapping("/shop/{shopid}")
    public Map<List<Shop>,List<Staff>> getList(@PathVariable("shopid") String shopid) {
        PostgreSQLJDBC posgre =new PostgreSQLJDBC();
        Map<List<Shop>,List<Staff>> displaylist=new HashMap<List<Shop>,List<Staff>>();
        displaylist.put(posgre.getList(shopid));
        return displaylist;

        //ssList.put(displayShop,displayStaff);
        //return PostgreSQLJDBC.getList(shopid);
    }
}


のようにしてRestCOntrollerで呼び出してショップIDごとにGoogle ChromeなどのブラウザにJSON形式で出力させたいと考えていますがエラーの部分で引っかかってコンパイルができません.
エラーの箇所から判断するにSpringBootを使っている@GetMapping以下がおかしいのだろうとは分かりますが,半日考えてもうまい解決方法が見つからないので,この辺りをどう直せばコンパイルすることができるのかアドバイス頂きたいです.

gradleの設定などlocalhostに表示させるための基本的な設定は完了しておりサンプルプログラムの動作確認済です.
またJavaのバージョンは質問前に最新のものにしてあります.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

エラーが文字化けしているのは、コンソールの文字コードと
Javaが出力するエラーメッセージの文字コードが異なる為で、
Javaのエラーとは何の関係もありません。

Map.putはkey, valueが必要であるにも関わらず、mapを設定しているのでエラーになっています。
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Map.html#put(K,V)

mapを追加する場合はputAllを使います。
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Map.html#putAll(java.util.Map)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/07/05 11:22 編集

    ご回答ありがとうございます.このエンコードの話について詳しく読んだことがなかったので勉強になりました.しかし,今回困っている点はエラーを読めるようにすることではなくコンパイルをできるようにしたいということなのでその方法を探しています.質問文を修正いたしましたので,よろしくお願いします.

    キャンセル

  • 2021/07/05 11:25

    そちらについても記載してありますが、読みました?

    キャンセル

  • 2021/07/05 11:39

    注意してこの通りにやり直したらちゃんとコンパイルできました.二度手間おかけしてしまい本当に申し訳ありません.ありがとうございました!!

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る