작성
·
694
0
@Controller
@RequestMapping("/test")
public class TestController {
@GetMapping("/test")
public void test1(){
System.out.println("test1");
}
@GetMapping("/test2")
public String test2(){
System.out.println("test2");
return "test/test";
}
@GetMapping("/test3")
public String test3(){
System.out.println("test3");
return "/test/test";
}
}
위와 같이 컨트롤러 작성하고
resources/templates/test/test.html 파일을 생성해 두었습니다.
인텔리제이에서는 아무런 문제없이 test, test2, test3 모두 정상적으로 실행되는데
jar파일 생성후 java -jar로 실행하면 test, test2는 실행되는데 test3를 호출하면
http://localhost:8080/test/test3
ERROR 3380 --- [nio-8080-exec-3] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-3] Exception processing template "/test/test": Error resolving template [/test/test], template might not exist or might not be accessible by any of the configured Template Resolvers
위와 같이 오류가 발생됩니다.
test3의 리턴값에 "/" 을 붙여 절대경로로 설정되어 있는것인데. 왜 인텔리제이에서는 정상적으로 실행되는반면 jar배포 파일로 실행하면 오류가 발생되는지 모르겠네요.
1. 위의 상황에서 리턴값에 "/" 이 포함안된 상대경로로 하는게 맞는것인지? "/" 포함된 절대경로로 하는게 맞는것인지? 또는 둘다 맞는것인지 궁금합니다.
2. 인텔리제이와 jar파일 배포시 왜 다른 결과가 나오는지 궁급합니다.
인텔리제이 2020.0.4 버전
스프링부트 2.5.0
자바 11
답변 2
2
안녕하세요. pimang님
결론부터 말씀드리면 test3과 같은 방식은 사용하시면 안됩니다. test2와 같은 방식을 사용하셔야 합니다.
기본으로 다음 두가지를 함께 조합하는데요.
prefix = "classpath:/templates/"
suffix = ".html"
test/test
classpath:/templates/test/test.html
/test/test
classpath:/templates//test/test.html
조합된 결과를 보시면 결과적으로 // 슬래시 2개가 들어가게 됩니다.
여기에서 IntelliJ에서 동작하는 이유는 저도 잘 모르겠지만, 결국 다른 환경에서 잘 동작하지 않을 가능성이 높습니다.
1번의 경우 return이 void이면 요청 URL을 맞추어서 뷰의 경로를 찾아줍니다. 그런데 이때도 2번과 같이 앞의 슬래시는 제거된다고 이해하시면 됩니다.
감사합니다.
1