- 작업 상태

그레이들에 종속성은 설정 한 후였고, HttpClient를 사용하려고 하는 중에 ClassNotFoundException이 발생했습니다.

HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
 
에러 메시지 
org/apache/hc/client5/http/classic/HttpClient] with root causejava.lang.ClassNotFoundException: org.apache.hc.client5.http.classic.HttpClient


원인

- 의존성 설정을 했는데 ClassNotFoundException이 발생해서 gradle의존성을 확인했습니다.

- 에러를 발생시키는 의존성입니다. 그레이들 설정입니다.

implementation 'org.apache.httpcomponents:httpclient:5.1.4' 

 

gradle 의존성을 확인해 봅니다.

./gradlew :projectName:dependencies

처리

Maven Repository: org.apache.httpcomponents.client5 » httpclient5 » 5.1.4 (mvnrepository.com)

기존 버전인데.종속성 문제가 해결이 안되어서 

버전을 변경해봤습니다.

Maven Repository: org.apache.httpcomponents.client5 » httpclient5 » 5.2.1 (mvnrepository.com)

    // implementation 'org.apache.httpcomponents:httpclient:5.1.4'
    implementation 'org.apache.httpcomponents.client5:httpclient5:5.2.1'

 

참고

그레이들 의존성 확인 명령어

./gradlew :projectName:dependencies

 ./gradlew :projectName:dependencies --configuration runtimeClasspath      

작업 상태

- 새로운 페이지 작업중이었습니다.

- controller 메소드 생성 후 페이지를 호출하던중 발생했습니다.

- 작업을 했던곳이어서 페이지가 존재할것이라고 생각하고 결과 페이지 확인을 안했습니다.

    @GetMapping("/admin/workings/todos/undone")
    public String unDoneList(Model model) {
        List<Todo> todos = todoService.findByIsCompleted("N");
        model.addAttribute("todos", todos);
        return "todo/list";
    }

에러 메시지 .[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.thymeleaf.exceptions.TemplateInputException: Error resolving template [todo/list], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [todo/list], template might not exist or might not be accessible by any of the configured Template Resolvers

 

원인

일반적으로 다음과 같은 경우에 발생할 수 있습니다.
- 요청한 템플릿이 프로젝트에서 실제로 존재하지 않는 경우. <-- 실제로 존재 하지 않았습니다.
- 요청한 템플릿의 경로가 잘못 지정된 경우.
- Thymeleaf 구성이 올바르게 구성되지 않은 경우.


처리

    @GetMapping("/admin/workings/todos/undone")
    public String unDoneList(Model model) {
        List<Todo> todos = todoService.findByIsCompleted("N");
        model.addAttribute("todos", todos);
        return "working/todolist"; //템플릿페이지 경로변경
    }

템플릿 생성 : src/main/resources/templates/working/todolist.html

 

참고

Thymeleaf 템플릿 엔진에서 시작 기본 위치는 src/main/resources/templates/ 입니다.
 
예를 들어, 
index.html 파일이 src/main/resources/templates/ 디렉토리에 있다면, 
Thymeleaf는 index.html 파일을 찾을 수 있습니다. 
따라서, 스프링 부트 프로젝트에서 Thymeleaf를 사용할 때, 
src/main/resources/templates/ 디렉토리에 HTML 파일을 저장하면, 
이 파일들은 자동으로 Thymeleaf가 처리할 수 있는 템플릿 파일이 됩니다.

스프링 부트에서는 spring.thymeleaf.prefix 속성을 사용하여 시작 기본 위치를 변경할 수 있습니다. 
이 속성을 사용하여 다른 디렉토리에서 템플릿 파일을 찾을 수 있습니다.

templates 디렉토리가 아닌 views 디렉토리에서 템플릿 파일을 찾으려면 
application.properties 파일에서 spring.thymeleaf.prefix 속성을 설정할 수 있습니다.

spring.thymeleaf.prefix = classpath:/views/

Thymeleaf는 src/main/resources/views/ 디렉토리에서 템플릿 파일을 찾게 됩니다.

작업 상태

application.properties 에서 값을 가져오는 과정에서 발생했습니다.


에러 메시지

java.nio.file.InvalidPathException: Trailing char < > at index 53: C:\Us......40\upload

원인

- 끝에 안보이는 공백이 있었습니다.

처리

 

application.properties
에러 상태

...
upload.folder=C:\\Us........pload <--뒤에 숨은 공간
...

 


수정 상태

...
upload.folder=C:\\Us........pload<--뒤에 숨은 공간
...


특이사항 없음.

작업 상태

- 스프링으로 파일첨부 작업을 하던중, Controller쪽에 있던 설정을 Service쪽으로 옮긴후에 발생한 에러입니다.

- Controller에서는 동작하던 상태였습니다.

- application.properties 설정 upload.folder=, 실제 위치 확인 완료 
 
에러 메시지 

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'fileUploadController' defined in file

 Unsatisfied dependency expressed through constructor parameter 0

 

원인

Spring 컨텍스트가 아직 초기화되지 않은 상태에서 StorageService 인스턴스가 생성되어서 발생하는 문제입니다.

 

처리

에러발생상태 코드


    @Service
    public class StorageService {
   
        @Value("${upload.folder}")
        private String uploadFolder;
   
        private final Path rootLocation;
   
        public StorageService() {
            this.rootLocation = Paths.get(uploadFolder);  //문제 발생부분
        }
...

처리 상태


@Service
public class StorageService {
    @Value("${upload.folder}")
    private String uploadFolder;
   
    private Path rootLocation;

    public StorageService() {    
        this.rootLocation = null;
    }
   
    @PostConstruct
    public void init() {
        this.rootLocation = Paths.get(uploadFolder);
    }

@PostConstruct 어노테이션이 붙은 메서드는 해당 클래스의 인스턴스 생성 및 DI가 완료된 후, 초기화 작업을 수행하기 위해 호출되는 메서드입니다.

@Value 어노테이션을 사용하면, 스프링 컨테이너가 빈을 생성할 때 주입하려는 값을 설정 파일(application.properties 또는 application.yml) 등 외부의 설정 파일에서 가져와서 주입할 수 있습니다.


참고

Getting Started | Uploading Files (spring.io)

 

Spring | Home

Cloud Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform.

spring.io

 

 

+ Recent posts