前提・実現したいこと
springbootを使い、簡単な登録、削除、一覧表示、詳細表示、あいまい検索ができるWebアプリケーションを作成しています。
アプリの内容としてはトップ画面から入力、一覧、検索画面に遷移するアプリです。
あいまい検索以外はすでに問題なく動作するところまで確認済みです。
ただ、起動し、検索の画面に遷移したところ画面上に下記のWhitelabel Errorが、STSでも下記のWARNが表示されていました。
エラーメッセージを読んでみたものの特にヒントにはなりませんでした。
### Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon Jun 22 23:46:07 JST 2020 There was an unexpected error (type=Bad Request, status=400).
### WARN WARN 4260 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'pra' is not present]
該当のソースコード
java
1//コントローラー。 2package com.example.demo; 3 4import java.util.List; 5import java.util.Optional; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.stereotype.Controller; 9import org.springframework.transaction.annotation.Transactional; 10import org.springframework.web.bind.annotation.ModelAttribute; 11import org.springframework.web.bind.annotation.PathVariable; 12import org.springframework.web.bind.annotation.RequestMapping; 13import org.springframework.web.bind.annotation.RequestMethod; 14import org.springframework.web.bind.annotation.RequestParam; 15import org.springframework.web.servlet.ModelAndView; 16 17@Controller 18public class MyController { 19 @Autowired 20 MyDataRepository repository; 21 22 //トップ 23 @RequestMapping("/") 24 public String index() { 25 return "index"; 26 } 27 28 //入力 29 @RequestMapping("/write") 30 public ModelAndView write(@ModelAttribute("formModel") MyData mydata,ModelAndView mv) { 31 mv.setViewName("write"); 32 return mv; 33 } 34 35 //フォーム 36 @RequestMapping(value="/form", method=RequestMethod.POST) 37 @Transactional(readOnly=false) 38 public ModelAndView form(@ModelAttribute("formModel") MyData mydata, ModelAndView mv) { 39 repository.saveAndFlush(mydata); 40 return new ModelAndView("redirect:/"); 41 } 42 43 //一覧 44 @RequestMapping(value="/list",method=RequestMethod.GET) 45 public ModelAndView list(ModelAndView mv) { 46 mv.setViewName("list"); 47 List<MyData> list = repository.findAll(); 48 mv.addObject("datalist", list); 49 return mv; 50 } 51 52 //詳細 53 @RequestMapping(value="/data/{id}",method=RequestMethod.GET) 54 public ModelAndView data(@ModelAttribute MyData mydata, @PathVariable int id, ModelAndView mv) { 55 mv.setViewName("data"); 56 Optional<MyData> data = repository.findById(id); 57 mv.addObject("formModel", data.get()); 58 return mv; 59 } 60 61 //削除 62 @RequestMapping(value="/delete/{id}",method=RequestMethod.GET) 63 public ModelAndView delete(@PathVariable int id, ModelAndView mv) { 64 mv.setViewName("delete"); 65 Optional<MyData> data = repository.findById(id); 66 mv.addObject("formModel", data.get()); 67 return mv; 68 } 69 @RequestMapping(value="/delete",method=RequestMethod.POST) 70 @Transactional(readOnly = false) 71 public ModelAndView remove(@RequestParam int id) { 72 repository.deleteById(id); 73 return new ModelAndView("redirect:/"); 74 } 75 76 //検索 77 @RequestMapping(value="/search") 78 public ModelAndView search(@RequestParam("pra") String pra,ModelAndView mv) { 79 List<MyData> list = repository.findByPraLike("%" + pra + "%"); 80 mv.addObject("dataList", list); 81 mv.setViewName("list"); 82 return mv; 83 } 84}
java
1//リポジトリ 2package com.example.demo; 3 4import java.util.List; 5import org.springframework.data.jpa.repository.JpaRepository; 6import org.springframework.stereotype.Repository; 7@Repository 8public interface MyDataRepository extends JpaRepository<MyData, Integer> { 9 List<MyData> findByPraLike(String pra); 10} 11
html
1<!-- 検索画面、単語を入力し、ボタンを押下するとリストで結果を表示 --> 2<!DOCTYPE html> 3<html xmlns:th="http://www.thymeleaf.org" > 4<head> 5<meta charset="UTF-8"> 6<title>検索画面</title> 7</head> 8<body> 9<form action="/search"> 10観光地<input type="text" name="pra" /> 11 12<input type="submit" value="検索" /><a href="/list"></a> 13<input type="button" value="検索" onclick="location.href='/list'"> 14</form> 15</body> 16</html> 17
html
1<!-- トップページのアプリで、ボタンで画面に遷移 --> 2<!DOCTYPE html> 3<html xmlns:th="http://www.thymeleaf.org" > 4<head> 5<meta charset="UTF-8"> 6<title>トップページ</title> 7</head> 8<body> 9<table> 10<tr><th><h2>旅行アプリ</h2></th></tr> 11</table> 12<input type="button" value="🛫(入力画面)" onclick="location.href='/write'"> 13<input type="button" value="🚅(一覧画面)" onclick="location.href='/list'"> 14<input type="button" value="🚌(検索画面)" onclick="location.href='/search'"> 15</body> 16</html> 17 18
試したこと
//検索となっている箇所の/searchを/search/{pra}に変更してみた。
補足情報(FW/ツールのバージョンなど)
開発ツール:STS4.3.2,H2Console
フレームワーク:Springboot
使用言語:Java SE11,HTML5
データベース:H2DB
テンプレートエンジン:Thymeleaf
あいまい検索はString型の変数praで検索を行える機能としています。