Spring Boot와 Thymeleaf 오류 해결 모음

와다닥·2023년 1월 2일
0

[SpringWeb]

목록 보기
1/1
post-custom-banner

오타가 없으며 존재함에도 불구하고) templates에서 html 파일을 찾지 못함

참고한 url: 링크

application.properties에 이하 코드 추가

spring.thymeleaf.mode=HTML5

DB 사용 설정을 해 둔 상태인데 DB 추가를 안 했더니 boot가 안 됨

참고한 url: 링크

application boot 파일의 @SpringBootApplication을 이하 코드로 수정

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

아니 분명히 뒤에 있다니까?

  • 오류
There was an unexpected error (type=Internal Server Error, status=500).
An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public java.lang.String community.web.PostReadController.deletePost(long,org.springframework.validation.Errors,org.springframework.web.bind.support.SessionStatus)
java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public java.lang.String community.web.PostReadController.deletePost(long,org.springframework.validation.Errors,org.springframework.web.bind.support.SessionStatus)

오류에서는 Errors를 model attribute나 @RequestBody 뒤에 선언하라는데 코드를 몇 번이나 다시 읽고 세수를 하고 와서 다시 쳐다봐도 내 코드는 진작부터 리퀘스트 뒤에 에러를 선언해뒀다.

분명 @RequestParam 뒤에 Errors가 선언됐음에도 불구하고 자꾸 오류가 뜨니 일주일차 웹린이는 패닉에 빠져 구글링을 미친듯이 한 것이다...

결론은 터무니 없었다.

@RequestBody와 Errors 및 BindingResult는 같이 못 쓴다. Errors를 파라미터에서 치우니 깔끔하게 다음 오류가 떴다. 만족스럽다.

참고한 url: 링크

  • 수정 전
...
	@PostMapping("/delete")
	@ResponseBody
	public String deletePost(@RequestParam long id, @Valid Errors errors, SessionStatus sessionStatus) {
		if (errors.hasErrors()) {
			return "read";
		}
		
		postRepo.delete(id);
		sessionStatus.setComplete();
		
		return "redirect:/home";
	}
...
  • 수정 후
...
	@PostMapping("/delete")
	@ResponseBody
	public String deletePost(@RequestParam long id, SessionStatus sessionStatus) {
		if (errors.hasErrors()) {
			return "read";
		}
		
		postRepo.delete(id);
		sessionStatus.setComplete();
		
		return "redirect:/home";
	}
...

html이 아니라 String을 반환하는 method

참고한 url: 링크

@ResponseBody가 붙어있으면 반환형 그대로 String으로 반환한다. @ResponseBody를 사용하는 것은, 반환된 String을 view의 이름으로 해석하지 말고 그대로 출력하라고 Spring에게 명령하는 것과 같다.


profile
I can't die I'm ALL IN
post-custom-banner

0개의 댓글