복붙노트

[SPRING] Spring 데이터 REST @Idclass가 인식되지 않습니다.

SPRING

Spring 데이터 REST @Idclass가 인식되지 않습니다.

아래에 EmployeeDepartment라는 엔티티가 있습니다.

@IdClass(EmployeeDepartmentPK.class) //EmployeeDepartmentPK is a serializeable object
@Entity
EmployeeDepartment{

@Id
private String employeeID;

@Id
private String departmentCode;
---- Getters, Setters and other props/columns
}

Spring Data Repository는 아래와 같이 정의되어 있습니다.

@RepositoryRestResource(....)
public interface IEmployeeDepartmentRepository extends PagingAndSortingRepository<EmployeeDepartment, EmployeeDepartmentPK> {

}

또한 String에서 EmployeeDepartmentPK로 변환하도록 등록 된 변환기가 있습니다.

ID가 employeeID = "abc123"이고 departmentCode = "JBG"인 엔티티의 경우 SDR 인터페이스가 호출 될 때 사용할 ID가 abc123_JBG라고 기대합니다. 예를 들어, http : // localhost / EmployeeDepartment / abc123_JBG는 결과를 가져 와서 실제로 가져와야합니다.

그러나 PUT을 사용하여 엔티티를 저장하려고하면 Spring Data Commons의 BasicPersistentEntity 클래스에서 사용할 수있는 ID 속성의 값이 departmentCode에 대한 abc123_JBG. 이것은 잘못된 것입니다. 이것이 예상 된 행동인지 확실하지 않습니다.

도와주세요.

감사!

해결법

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

    1.현재 스프링 데이터 REST는 단일 필드로 표현되는 복합 키만 지원합니다. 즉, @EmbeddedId 만 지원된다는 의미입니다. 나는 그것을 고칠 DATAJPA-770을 신청했다.

    현재 스프링 데이터 REST는 단일 필드로 표현되는 복합 키만 지원합니다. 즉, @EmbeddedId 만 지원된다는 의미입니다. 나는 그것을 고칠 DATAJPA-770을 신청했다.

    @EmbeddedId로 전환 할 수 있다면 URI에서 복합 식별자를 표현하는 방법과 경로 세그먼트를 ID 유형의 인스턴스로 다시 변환하는 방법을 Spring 데이터 REST에 알려줘야합니다. 이를 위해 BackendIdConverter를 구현하고 Spring 빈으로 등록하십시오.

    @Component
    class CustomBackendIdConverter implements BackendIdConverter {
    
      @Override
      public Serializable fromRequestId(String id, Class<?> entityType) {
    
        // Make sure you validate the input
    
        String[] parts = id.split("_");
        return new YourEmbeddedIdType(parts[0], parts[1]);
      }
    
      @Override
      public String toRequestId(Serializable source, Class<?> entityType) {
    
        YourIdType id = (YourIdType) source;
        return String.format("%s_%s", …);
      }
    
      @Override
      public boolean supports(Class<?> type) {
        return YourDomainType.class.equals(type);
      }
    }
    
  2. ==============================

    2.@EmbeddedId를 사용할 수 없다면, 여전히 @IdClass를 사용할 수 있습니다. 이를 위해서는 Oliver Gierke가 대답 한대로 BackendIdConverter가 필요하지만 도메인 유형에 대한 조회를 추가해야합니다.

    @EmbeddedId를 사용할 수 없다면, 여전히 @IdClass를 사용할 수 있습니다. 이를 위해서는 Oliver Gierke가 대답 한대로 BackendIdConverter가 필요하지만 도메인 유형에 대한 조회를 추가해야합니다.

    @Configuration
    public class IdClassAllowingConfig extends RepositoryRestConfigurerAdapter {
    
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.withEntityLookup().forRepository(EmployeeDepartmentRepository.class, (EmployeeDepartment ed) -> {
            EmployeeDepartmentPK pk = new EmployeeDepartmentPK();
            pk.setDepartmentId(ed.getDepartmentId());
            pk.setEmployeeId(ed.getEmployeeId());
            return pk;
        }, EmployeeDepartmentRepository::findOne);
    }
    

    }

  3. from https://stackoverflow.com/questions/31816468/spring-data-rest-idclass-not-recognized by cc-by-sa and MIT license