복붙노트

[SPRING] Spring 데이터 저장소에서 getOne (...)이 EntityNotFoundException을 던지지 않는 이유는 무엇입니까?

SPRING

Spring 데이터 저장소에서 getOne (...)이 EntityNotFoundException을 던지지 않는 이유는 무엇입니까?

이상한 문제를 해결하기 위해 노력하고 있습니다. 통합 테스트를 수행하면서 존재하지 않는 데이터베이스에서 객체를 가져 오기 위해 컨트롤러를 호출했습니다.

public Optional<T> get(Long id) {

  try {
    return Optional.ofNullable(repository.getOne(id));
  } catch(EntityNotFoundException e) {
    return Optional.empty();
  }
}

getOne (...)이 아무 것도 찾을 수 없을 때 EntityNotFoundException을 기대했지만 실제로는 아무것도 아니 었습니다. 내 결과를 살펴보면 핸들러 링크가있는 빈 엔티티가 "EntityNotFoundException을 던졌습니다."는 것을 알 수 있지만 catch에 들어 가지 않고 선택 사항 인이 엔티티를 반환합니다.

나는이 행동을 이해할 수 없다.

해결법

  1. ==============================

    1.이는 JPA가 EntityManager.getReference (...)를 지정하는 방식 때문입니다. 그것은 속성의 첫 번째 액세스시 반환 될 객체를 해결하거나 결국 포함 된 예외를 던질 프록시를 반환해야합니다.

    이는 JPA가 EntityManager.getReference (...)를 지정하는 방식 때문입니다. 그것은 속성의 첫 번째 액세스시 반환 될 객체를 해결하거나 결국 포함 된 예외를 던질 프록시를 반환해야합니다.

    이 문제를 해결하는 가장 쉬운 방법은이 대신 Optional.ofNullable (repository.findOne (...))과 같이 findOne (...)을 대신 사용하는 것입니다. findOne (...)은 결과가없는 경우 null을 반환합니다.

    이 문제를 해결하는보다 진보 된 방법은 저장소가 선택적 인스턴스를 직접 반환하도록하는 것입니다. find ... -methods에 대한 반환 유형으로 Optional 를 사용하여 사용자 정의 기본 저장소 인터페이스를 작성하면이 작업을 수행 할 수 있습니다.

    interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
    
      Optional<T> findOne(ID id);
    
      // declare additional methods if needed
    }
    
    interface YourRepository extends BaseRepository<DomainClass, Long> { … }
    

    Spring Data Examples 저장소에서 이에 대한 완전한 예제를 찾아보십시오.

  2. ==============================

    2.이것이 나를 위해 일한 방법입니다.

    이것이 나를 위해 일한 방법입니다.

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
    
  3. from https://stackoverflow.com/questions/32264758/why-does-getone-on-a-spring-data-repository-not-throw-an-entitynotfoundexcept by cc-by-sa and MIT license