728x90
에러 발생
Required String parameter 'keyword' is not present
나의 구현 현황을 보면 이렇다.
1. 쿼리문 하나로 검색 기능을 구현하지 못해
검색한 게시물 리스트 불러오기, 모든 게시물 리스트 불러오기
두 가지 쿼리문을 제작하였다.
2. 제작한 쿼리문을 오버 라이딩을 하여 메서드를 구현하였다.
맨 처음 도전한 방식은
같은 매핑 주소를 사용하여 키워드가 있을 경우, 없을 경우를 나눠 메서드 두 개를 제작했다.
위의 경우로 구현할 경우 생겼던 문제는
Keyword 파라미터가 있던 없던 서치기능이 없는 모든 게시물이 출력되는 현상이 일어났다.
원인과 해결
오버라이딩 된 메소드가 실행되지 않는 문제를 해결하기 위해
매핑을 한 두 메소드를 하나로 합쳐 keyword가 있을 경우와 없을 경우
if문으로 내가 원하는 상황에 원하는 메소드가 실행될 수 있도록 구현했다.
// 게시판 목록 (+ 검색 추가)
@RequestMapping(value = "/list", method = {RequestMethod.GET, RequestMethod.POST})
public String list(@RequestParam("keyword") String keyword, HttpServletRequest req, Model model) {
System.out.println("BoardController > list");
HttpSession session = req.getSession();
UserVo authUser = (UserVo) session.getAttribute("authUser");
session.setAttribute("authUser", authUser);
if(keyword != null) {
List<BoardVo> bList = bService.getBoardList(keyword);
model.addAttribute("bList", bList);
}else {
List<BoardVo> bList = bService.getBoardList();
model.addAttribute("bList", bList);
}
return "board/list";
}
keyword가 존재하면 검색 키워드가 매개변수로 존재하는 메소드로
존재하지 않는다면 전체 게시물 목록을 불러오는 메소드로 진행되도록 구현했는데
이때 발생하는 에러가 Required String parameter 'keyword' is not present 해당 에러였다.
파라미터가 존재하지 않아서 발생하는 에러였는데
@RequestParam에 require값을 지정하여 파라미터의 유무에 따라 그 기능을 활성/비활성화할 수 있었다.
@RequestParam(required = false, value= "")
위와 같은 방법을 사용하여 코드를 수정하였고 검색 키워드가 없을 때도 무사히 게시판으로 이동하는 것을 확인하였다.
@RequestMapping(value = "/list", method = {RequestMethod.GET, RequestMethod.POST})
public String list(@RequestParam(required = false, value= "keyword") String keyword, HttpServletRequest req, Model model) {
System.out.println("BoardController > list");
HttpSession session = req.getSession();
UserVo authUser = (UserVo) session.getAttribute("authUser");
session.setAttribute("authUser", authUser);
if(keyword != null) {
List<BoardVo> bList = bService.getBoardList(keyword);
model.addAttribute("bList", bList);
}else {
List<BoardVo> bList = bService.getBoardList();
model.addAttribute("bList", bList);
}
return "board/list";
}
반응형