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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/21 15:36
2018/01/21 15:45
退会済みユーザー
2018/01/22 14:46