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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Java

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

Spring Boot

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

Q&A

解決済

2回答

2806閲覧

Spring Boot で IndexOutOfBoundsException

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2018/01/21 15:24

Spring Boot でチャットアプリを作成しています。
/roomsでformのボタンをクリックするとPostメソッドからgetUserByIdメソッドでUsersテーブルからselectするのですが、
レコードが0件だったようでIndexOutOfBoundsExceptionになりました。
まだユーザー認証を作ってないのでダミーのユーザーID1を決め打ちしてます。
ログを貼ろうとしたら字数制限にかかってしまいましたので、必要な場合はお申しつけください。
どのあたりから調べればよいかご指導いただけないでしょうか。

よろしくお願いいたします。

DDL

lang

1create table app.users ( 2 id number generated always as identity primary key, 3 name nvarchar2(32) not null, 4 password nvarchar2(32) not null); 5 6create table app.rooms ( 7 id number generated always as identity primary key, 8 owner_id number references app.users(id)); 9 10create table app.memberships ( 11 membership_id number generated always as identity primary key, 12 room_id number references app.users(id), 13 user_id number references app.rooms(id)); 14 15create table app.messages ( 16 id number generated always as identity primary key, 17 sender_id number references app.users(id), 18 room_id number references app.rooms(id), 19 text nvarchar2(256) not null, 20 created_at timestamp default systimestamp not null);

usersテーブルの状態
select * from app.users

ID NAME PASSWORD ---------- -------------------------------- -------------------------------- 1 test01 password

application.yml

lang

1spring: 2 datasource: 3 url: jdbc:oracle:thin:@localhost:1521:chatdb 4 username: app 5 password: password 6 driverClassName: oracle.jdbc.driver.OracleDriver 7server: 8 port: 80

RoomsController.java

lang

1package com.springTalk.web; 2 3import java.util.List; 4 5import javax.servlet.http.HttpServletRequest; 6import javax.validation.Valid; 7 8import org.springframework.beans.factory.annotation.Autowired; 9import org.springframework.stereotype.Controller; 10import org.springframework.ui.Model; 11import org.springframework.validation.BindingResult; 12import org.springframework.web.bind.annotation.GetMapping; 13import org.springframework.web.bind.annotation.PostMapping; 14 15import com.springTalk.domain.Message; 16import com.springTalk.domain.Room; 17import com.springTalk.domain.User; 18import com.springTalk.service.MessageService; 19import com.springTalk.service.RoomService; 20import com.springTalk.service.UserService; 21 22@Controller 23public class RoomsController { 24 @Autowired 25 private UserService userService; 26 @Autowired 27 private RoomService roomService; 28 @Autowired 29 private MessageService messageService; 30 31 @GetMapping("/rooms") 32 public String roomsGet(Model model) { 33 List<Room> rooms = roomService.getRoomsOrderByIdDesc(); 34 model.addAttribute("room", rooms); 35 model.addAttribute("roomsForm", new RoomsForm()); 36 return "rooms"; 37 } 38 39 @PostMapping("/rooms") 40 public String roomsPost(Model model, @Valid RoomsForm roomsForm, BindingResult bindingResult, 41 HttpServletRequest request) { 42 if (bindingResult.hasErrors()) { 43 List<Room> rooms = roomService.getRoomsOrderByIdDesc(); 44 model.addAttribute("room", rooms); 45 model.addAttribute("roomsForm", new RoomsForm()); 46 return "rooms"; 47 } 48 49 // get dummy user 50 // ToDo: get user id from request 51 final Long OWNER_ID = 1L; 52 User user = userService.getUserById(OWNER_ID).get(0); 53 Room room = roomService.saveAndFlush(new Room(user)); 54 messageService.save(new Message(user, room, roomsForm.getText())); 55 return "redirect:/rooms"; 56 } 57}

UserService.java

lang

1package com.springTalk.service; 2 3import java.util.List; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.stereotype.Service; 7import org.springframework.transaction.annotation.Transactional; 8 9import com.springTalk.domain.User; 10import com.springTalk.domain.UserRepository; 11 12@Service 13public class UserService { 14 15 @Autowired 16 private UserRepository repository; 17 18 public List<User> getUserById(Long id) { 19 return repository.findById(id); 20 } 21 22 public List<User> getUserByNameOrderById(String name) { 23 return repository.findByNameOrderById(name); 24 } 25 26 @Transactional 27 public void save(User user) { 28 repository.save(user); 29 } 30}

UserRepository.java

lang

1package com.springTalk.domain; 2 3import java.util.List; 4 5import org.springframework.data.jpa.repository.JpaRepository; 6import org.springframework.stereotype.Repository; 7 8@Repository 9public interface UserRepository extends JpaRepository<User, Long> { 10 List<User> findById(Long id); 11 12 List<User> findByNameOrderById(String name); 13}

User.java

lang

1package com.springTalk.domain; 2 3import java.util.List; 4 5import javax.persistence.CascadeType; 6import javax.persistence.Column; 7import javax.persistence.Entity; 8import javax.persistence.FetchType; 9import javax.persistence.GeneratedValue; 10import javax.persistence.GenerationType; 11import javax.persistence.Id; 12import javax.persistence.OneToMany; 13import javax.persistence.Table; 14 15@Entity 16@Table(name = "app.users") 17public class User { 18 @Id 19 @GeneratedValue(strategy = GenerationType.AUTO) 20 private Long id; 21 22 @Column(nullable = false) 23 private String name; 24 25 @Column(nullable = false) 26 private String password; 27 28 @OneToMany(mappedBy = "ownerId", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 29 private List<Room> rooms; 30 31 @OneToMany(mappedBy = "userId", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 32 private List<Membership> memberships; 33 34 @OneToMany(mappedBy = "senderId", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 35 private List<Message> messages; 36 37 // JPA requirement 38 protected User() { 39 } 40 41 public User(String name, String password) { 42 this.name = name; 43 this.password = password; 44 } 45 46 public Long getId() { 47 return id; 48 } 49 50 public String getName() { 51 return name; 52 } 53 54 public void setName(String name) { 55 this.name = name; 56 } 57 58 public String getPassword() { 59 return password; 60 } 61 62 public void setPassword(String password) { 63 this.password = password; 64 } 65}

環境
Spring Boot 1.5.9 RELEASE
Oracle VM VirtualBox 5.1.22 r115126 (Qt5.6.2)
CentOS 7.3.1611
openjdk version "1.8.0_141"
Oracle Database 12c Release 2

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

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

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

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

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

guest

回答2

0

RoomsController の roomsPost メソッドにて、

java

1User user = userService.getUserById(OWNER_ID).get(0);

と書かれていますが、ここで1件も取得できないのであれば get(0)で指定しても取得できず IndexOutOfBoundsException がスローされてしまうでしょうか。

userService.getUserById した後に要素があるのかどうかをチェックして値を格納すべきでしょう。

投稿2018/01/21 15:31

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2018/01/21 15:36

ありがとうございます。 ただ、この場合はID=1のレコードが1件返される想定なのですが、これに関してはなぜなのでしょうか?
A-pZ

2018/01/21 15:45

実際テーブルにIDが1のレコードが含まれていないか、JPAの設定に何らかの抜けがあるのだと思います。 ほかにも Userクラスのidに対し、ミューテータ(setメソッド)がありません。
退会済みユーザー

退会済みユーザー

2018/01/22 14:46

ありがとうございます。 解決しました。 ちなみにidは自動生成なのでsetterはつけていません。
guest

0

ベストアンサー

OracleではなくH2に接続していたようです。
application.ymlのインデントが誤っていました。
また別事象でトラブルに遭っていますが、別途質問したいと思います。
ご覧いただきありがとうございました。

application.yml

lang

1spring: 2 datasource: 3 url: jdbc:oracle:thin:@localhost:1521:chatdb 4 username: app 5 password: password 6 driverClassName: oracle.jdbc.driver.OracleDriver 7server: 8 port: 80

投稿2018/01/22 14:33

編集2018/01/22 14:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問