前提・実現したいこと
題のとおりで送信するとページが表示されなくなります
フレームワーク Springframework
追記 いわれてみて本当にreservationFormが送られているのか気になったので試してみた結果空白のページが表示され、ここに問題があることがわかりました。
追記2 testのほうをmodel.addAttribute("startTime",reservationForm.getStartTime());に変更してhtmlのほうも${startTime}とすると表示されるようになりました(本来のreserveメソッドのほうは依然としてエラーです)
追記3reserveのこの文が原因でした。なにか解決策はないでしょうか?原因がわかる方はおしえてくれたら助かります
ReservableRoom reservable = reservableRoomRepository.findById(reservableRoomId).orElseGet(null);
追記4reservableがnullの時ifにひっかかるコードでしたが、ここを!=とした時も同様のエラー、nullかどうかなんて関係なくて追記3の命令を実行するだけでエラー
発生している問題・エラーメッセージ
WEBページ Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon May 27 16:54:03 JST 2019 There was an unexpected error (type=Internal Server Error, status=500). No message available
[2m2019-05-27 17:50:14.414[0;39m [31mERROR[0;39m [35m2060[0;39m [2m---[0;39m [2m[nio-8080-exec-3][0;39m [36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null
該当のソースコード
!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title th:text="|${#temporals.format(date,'yyyy/M/d')}の${room.roomName}|">2016/05/20の豊洲</title> </head> <body> <div> <a th:href="@{'/room/' + ${date}}">会議室一覧へ</a> </div> <p style = "coler:red" th:if="${error != null}" th:text="${error}"></p> <form th:object="${reservationForm}" th:action="@{'/reservations/' + ${date} + '/' + ${roomId}}" method = "post"> 会議室:<span th:text="${room.roomName}"> 豊洲</span> <br/> 予約者名:<span th:text="${user.lastName + '' + user.firstName}">山田太郎</span> <br/> 日付:<span th:text="${#temporals.format(date,'yyyy/M/d')}">2016/5/20</span> <br/> 時間帯: <select th:field="*{startTime}"> <option th:each="time : ${timeList}" th:text="${time}" th:value="${time}">09:00</option> </select> <span th:if="${#fields.hasErrors('startTime')}" th:errors="*{startTime}" style="coler:red"> error!</span> <select th:field="*{endTime}"> <option th:each="time:${timeList}"th:text = "${time}" th:value="${time}">10:00</option> </select> <span th:if="${#fields.hasErrors('endTime')}" th:errors="*{endTime}" style="color:red"> error!</span> <br/> <button>予約</button> </form> <table> <tr> <th>時間帯</th> <th>予約者</th> <th>操作</th> </tr> <tr th:each="reservation:${reservations}"> <td> <span th:text="${reservation.startTime}"></span> <span th:text="${reservation.endTime}"></span> </td> <td> <span th:text="${reservation.user.lastName}"></span> <span th:text="${reservation.user.firstName}"></span> </td> <td> <form th:action="@{'/reservations/' + ${date} + '/' + ${roomId}}" method="post" th:if="${user.userId == reservation.user.userId}"> <input type="hidden" name="reservatjonId" th:value="${reservation.reservationId}"/> <input type="submit" name="cancel" value="取消"/> </form> </td> </tr> </table> </body> </html>
java
1問題のないコードは省略 2@Controller 3@RequestMapping("reservations/{date}/{roomId}") 4public class ReservationsController { 5 @Autowired 6 RoomService roomService; 7 @Autowired 8 ReservationService reservationService; 9 10 @ModelAttribute 11 ReservationForm setUpForm() { 12 ReservationForm reservationForm = new ReservationForm(); 13 14 reservationForm.setStartTime(LocalTime.of(9, 0)); 15 reservationForm.setEndTime(LocalTime.of(10,0)); 16 return reservationForm; 17 } 18 19 private User dumyUser() { 20 User user = new User(); 21 user.setUserId("taro-yamada"); 22 user.setFirstName("太郎"); 23 user.setLastName("山田"); 24 user.setRoleName(RoleName.USER); 25 return user; 26 } 27 @RequestMapping(method = RequestMethod.POST) 28 29 String reserve(@Validated ReservationForm reservationForm,BindingResult bindingResult, 30 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)@PathVariable("date")LocalDate date, 31 @PathVariable("roomId")Integer roomId,Model model) { 32 if(bindingResult.hasErrors()) { 33 return reserveForm(date,roomId,model); 34 } 35 ReservableRoom reservableRoom = new ReservableRoom(new ReservableRoomId(roomId,date)); 36 Reservation reservation = new Reservation(); 37 reservation.setStartTime(reservationForm.getStartTime()); 38 reservation.setEndTime(reservationForm.getEndTime()); 39 reservation.setReservableRoom(reservableRoom); 40 reservation.setUser(dumyUser()); 41 42 try { 43 reservationService.reserve(reservation); 44 } 45 catch(UnavailableReservationException | AlreadyReservedException e){ 46 model.addAttribute("error",e.getMessage()); 47 return reserveForm(date,roomId,model); 48 } 49 return "redirect:/reservations/{date}/{roomId}"; 50 } 51 @Re
java
1ここもあやしそうなので一応 2package mrs.domain.service.reservation; 3 4import java.util.List; 5import java.util.Objects; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Service; 9import org.springframework.transaction.annotation.Transactional; 10 11import mrs.domain.model.ReservableRoom; 12import mrs.domain.model.ReservableRoomId; 13import mrs.domain.model.Reservation; 14import mrs.domain.model.RoleName; 15import mrs.domain.model.User; 16import mrs.domain.repository.reservation.ReservationRepository; 17import mrs.domain.repository.room.ReservableRoomRepository; 18 19@Service 20@Transactional 21public class ReservationService { 22 @Autowired 23 ReservationRepository reservationRepository; 24 @Autowired 25 ReservableRoomRepository reservableRoomRepository; 26 27 public Reservation reserve(Reservation reservation) { 28 ReservableRoomId reservableRoomId = reservation.getReservableRoom().getReservableRoomId(); 29 ReservableRoom reservable = reservableRoomRepository.findById(reservableRoomId).orElseGet(null); 30 if(reservable == null) { 31 throw new UnavailableReservationException("入力の日付・部屋の組み合わせは予約できません。"); 32 } 33 boolean overlap = reservationRepository.findByReservableRoom_ReservableRoomIdOrderByStartTimeAsc(reservableRoomId) 34 .stream() 35 .anyMatch(x -> x.overlap(reservation)); 36 if(overlap) { 37 throw new AlreadyReservedException("入力の時間帯はすでに予約済みです。"); 38 } 39 reservationRepository.save(reservation); 40 return reservation; 41 } 42} 43
test.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title th:text="テスト">テスト</title> </head> <body> <div th:object="${reservationForm}"></div> <span th:text="*{startTime}"></span><br/> <span th:text="*{endTime}"></span><br/> </body> </html>
java
1ReservationsControllerクラスのreserve()コメント化して以下のメソッド追加 2String test(@Validated ReservationForm reservationForm,BindingResult bindingResult, 3 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)@PathVariable("date")LocalDate date, 4 @PathVariable("roomId")Integer roomId,Model model) { 5 model.addAttribute("reservationFrom",reservationForm); 6 return "test"; 7 }
WEBページ上でのHTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>テスト</title> </head> <body> <div></div> <span></span><br/> <span></span><br/> </body> </html>
試したこと
メソッド内の処理をreturnのみにする→想定内の処理で何もおこらない
コントローラからreserve抜いてstartTime,endTimeをそれぞれnullにしたところ問題なくリダイレクトした
→reserveに問題がありそう
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー