2015-08-04 16 views
7

Ho un'entità denominata EmployeeDepartment come di seguitoprimavera dati REST @Idclass non riconosciuto

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

@Id 
private String employeeID; 

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

e ho un Data Repository primavera definito come di seguito

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

} 

Inoltre, ho un convertitore registrata per convertire da String a EmployeeDepartmentPK.

Ora, per un'entità, qualificata da ID employeeID = "abc123" e departmentCode = "JBG", mi aspetto che l'ID da utilizzare quando viene chiamata l'interfaccia SDR sia abc123_JBG. Ad esempio, http://localhost/EmployeeDepartment/abc123_JBG dovrebbe portarmi il risultato e in effetti lo fa.

Tuttavia, quando provo a salvare un'entità utilizzando PUT, la proprietà ID disponibile nella classe BasicPersistentEntity di Spring Data Commons ha un valore di abc123_JBG per departmentCode. Questo è sbagliato. Non sono sicuro se questo è un comportamento previsto.

Per favore aiuto.

Grazie!

risposta

10

Attualmente Spring Data REST supporta solo chiavi composte rappresentate come da un singolo campo. Ciò significa che è supportato solo @EmbeddedId. Ho depositato DATAJPA-770 per risolvere il problema.

Se è possibile passare a @EmbeddedId è ancora necessario insegnare a Spring Data REST il modo in cui si desidera rappresentare l'identificatore complesso nell'URI e come trasformare il segmento di percorso in un'istanza del tipo di ID. Per ottenere ciò, implementare uno BackendIdConverter e registrarlo come bean 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); 
    } 
} 
+0

ho seguito questa proposta solo per inciampare su come creare un embeddedId da una richiesta di posta. Vedi: http://stackoverflow.com/questions/36606251/spring-data-rest-embeddedid-cannot-be-constructed-from-post-request – Gregor

2

Se non è possibile utilizzare @EmbeddedId, è comunque possibile utilizzare @IdClass. Per questo, è necessario il BackendIdConverter come rispose Oliver Gierke, ma è anche necessario aggiungere un Lookup per il vostro tipo di dominio:

@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

geniale, grazie. – KeatsPeeks