2015-08-04 18 views
7

Tôi có một thực thể có tên EmployeeDepartment như saumùa xuân dữ liệu REST của @Idclass không được công nhận

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

@Id 
private String employeeID; 

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

và tôi có một mùa xuân dữ liệu Repository định nghĩa là như sau

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

} 

Hơn nữa, tôi có một chuyển đổi đăng ký để chuyển đổi từ chuỗi thành EmployeeDepartmentPK.

Bây giờ, đối với một thực thể, đủ điều kiện bởi ID employeeID = "abc123" và departmentCode = "JBG", tôi mong ID sẽ sử dụng khi giao diện SDR được gọi là abc123_JBG. Ví dụ: http://localhost/EmployeeDepartment/abc123_JBG sẽ tìm nạp kết quả và thực sự là như vậy.

Nhưng, khi tôi cố lưu một thực thể bằng PUT, thuộc tính ID có sẵn trong lớp BasicPersistentEntity của Spring Data Commons có giá trị là abc123_JBG cho departmentCode. Cái này sai. Tôi không chắc chắn nếu đây là một hành vi mong đợi.

Vui lòng trợ giúp.

Cảm ơn!

Trả lời

10

Hiện tại dữ liệu Spring REST chỉ hỗ trợ các phím ghép được biểu diễn bằng một trường đơn. Điều đó có nghĩa là chỉ hỗ trợ @EmbeddedId. Tôi đã nộp DATAJPA-770 để sửa lỗi đó.

Nếu bạn có thể chuyển sang @EmbeddedId bạn vẫn cần dạy REST Data REST theo cách bạn muốn trình bày mã định danh phức tạp của mình trong URI và cách chuyển đoạn đường dẫn trở lại thành thể hiện của loại id của bạn. Để đạt được điều đó, hãy thực hiện BackendIdConverter và đăng ký nó làm Spring bean.

@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); 
    } 
} 
+0

Tôi đi theo đề xuất này chỉ để vấp ngã trên làm thế nào để tạo ra một embeddedId bởi một yêu cầu đăng bài. Xem: http://stackoverflow.com/questions/36606251/spring-data-rest-embeddedid-cannot-be-constructed-from-post-request – Gregor

2

Nếu bạn không thể sử dụng @EmbeddedId, bạn vẫn có thể sử dụng @IdClass. Cho rằng, bạn cần BackendIdConverter như Oliver Gierke đã trả lời, nhưng bạn cũng cần phải thêm một Lookup cho loại tên miền của bạn:

@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); 
} 

}

+0

rực rỡ, cảm ơn bạn. – KeatsPeeks

Các vấn đề liên quan