작업 상태

- TodoController라는 콘트롤러에서 json으로 데이터를 받아 update하는 과정에서 발생했습니다.
 
에러 메시지 

- java.lang.Error: Unresolved compilation problems:
        The method setIsCompleted(String) is undefined for the type Optional<Todo>
        The method save(Todo) in the type TodoService is not applicable for the arguments (Optional<Todo>)

원인

 Optional<Todo> currentTodo  currentTodo의 현재 타입은  Optional<Todo>입니다.

Optional<Todo> 는 Todo 클래스가 아니기 때문에 Todo 클래스의 메소드를 사용할수 없습니다.


증상 발생 코드 

@PostMapping("/admin/todos/complete")
public ResponseEntity<String> updateComplete(@RequestBody @Valid Todo todo,
        BindingResult result) {
        Optional<Todo> currentTodo = todoService.findById(todo.getId());
    if (currentTodo.isPresent()) { 
        currentTodo.setIsCompleted(todo.getIsCompleted());
        todoService.save(currentTodo);
        return ResponseEntity.ok("저장되었습니다.");
    } else {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Working not found");
    }
}

 

처리코드

@PostMapping("/admin/todos/complete")
public ResponseEntity<String> updateComplete(@RequestBody @Valid Todo todo,
        BindingResult result) {
        Optional<Todo> searchTodo = todoService.findById(todo.getId());
    if (searchTodo.isPresent()) { 
        Todo currentTodo = searchTodo.get();
        currentTodo.setIsCompleted(todo.getIsCompleted());
        todoService.save(currentTodo);
        return ResponseEntity.ok().build();
    } else {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Working not found");
    }
}


참고

Optional은 Java 8에서 추가된 클래스로, 값이 있을 수도 있고 없을 수도 있는 객체를 감싸는 래퍼 클래스입니다. 이를 통해 NullPointerException 등의 오류를 방지할 수 있습니다. 데이터를 조회해서 가져오는 등의 작업을 할때도 사용됩니다.

 

메소드
of: 주어진 값으로 Optional 객체를 생성합니다. 값이 null인 경우에는 NullPointerException이 발생합니다.
isPresent: Optional 객체에 값이 있는지 여부를 반환합니다.

get: Optional 객체에 저장된 값을 반환합니다. 값이 없는 경우에는 NoSuchElementException이 발생합니다.

 

Optional<String> name = Optional.of("John");// "John"이라는 값을 가진 Optional 객체를 생성합니다.
if (name.isPresent()) {  //값이 있는지 여부를 체크합니다.
    System.out.println("Hello, " + name.get() + "!"); // get 메소드를 이용해값을 가져옵니다.
} else {
    System.out.println("Hello, anonymous!");
}

+ Recent posts