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

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

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

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

Q&A

解決済

1回答

3351閲覧

formから送信するとぬるぽ

jampack

総合スコア10

Java

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

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

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

0グッド

0クリップ

投稿2019/05/27 09:12

編集2019/05/29 06:02

前提・実現したいこと

題のとおりで送信するとページが表示されなくなります
フレームワーク 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
2019-05-27 17:50:14.414 ERROR 2060 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]  : 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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2019/05/27 09:21

>th:action="@{'/reservations/' + ${date} + '/' + ${roomId}}" ここ、ブラウザ「ソースを表示」から想定通りの情報が出力されているか確認されましたか?
jampack

2019/05/27 09:40

はい、想定通りの情報でした
退会済みユーザー

退会済みユーザー

2019/05/27 10:58

なにがNULLなのか確認しましょう
jampack

2019/05/27 12:10

Reservation reservation = new Reservation(); reservation.setStartTime(null); reservation.setEndTime(null); reservation.setReservableRoom(reservableRoom); reservation.setUser(dumyUser()); でtry,catchブロック消した場合動いたので実際問題はreserveにあると思うんですけどreservationは上の試行で問題ないとわかってるのでreservableしかないんですがこれがnullだとエラーメッセージが出るはずなんで正直わからないです
jampack

2019/05/28 03:33

書いてて気になってしまったんですけどhtml側でprivateなフィールドに代入ってどういう事でしょう?勝手にセッター使ってるとかでしょうか?
guest

回答1

0

自己解決

ReservableRoom reservable=reservableRoomRepository.findById(reservableRoomId).orElse(null);で解決orElseGet(null)だとぬるぽになるらしいです。

投稿2019/05/29 05:17

jampack

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問