2015-02-10 28 views
6

Model sınıflarımı (jpa varlıkları), farklı veri aktarım nesnelerine (DTO'lar) sahip özniteliklerinin alt kümesini göstermek istemiyorum. Buradaki fikir DTO CrudRepository <-> JpaRepository <-> entities'dur ve Spring Data REST üzerinden DTO CrudRepository'u göstermek istiyorum.Yay verisi REST ile özel DTO crud deposunu nasıl gösterirsiniz?

Örnek:

Birimi:

@Entity 
@Table(name = "groups") 
public class Group { 

    private Long id; 
    private String name; 
    private Set<User> users; 
    // other attributes 

    @Id 
    @GeneratedValue 
    @Column(name = "group_id") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "name", nullable = false) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToMany(mappedBy = "group") 
    public Set<User> getUsers() { 
     return users; 
    } 

    public void setUsers(Set<User> users) { 
     this.users = users; 
    } 

    // other getters and setters 

} 

JpaRepository:

@RepositoryRestResource(exported = false) 
public interface GroupDao extends JpaRepository<Group, Long> { 
} 

DTO:

public class GroupWithoutRelationsDto { 

    private Long id; 
    private String name; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @NotBlank 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

DTO CrudRepository:

public interface GroupDtoDao extends CrudRepository<GroupWithoutRelationsDto, Long> { 
} 

Uygulama:

@Repository 
public class GroupDtoDaoImpl extends GenericDtoDao<GroupWithoutRelationsDto, Group, Long> implements GroupDtoDao { 

    @Autowired 
    private GroupDao groupDao; 

    @Override 
    protected CrudRepository<Group, Long> getModelDao() { 
     return groupDao; 
    } 

    @Override 
    protected <S extends GroupWithoutRelationsDto> Long getDtoId(S dto) { 
     return dto.getId(); 
    } 

    @Override 
    protected Long getModelId(Group model) { 
     return model.getId(); 
    } 

    @Override 
    protected <S extends GroupWithoutRelationsDto> S modelToDto(Group model, S dto) { 
     dto.setId(model.getId()); 
     dto.setName(model.getName()); 
     return dto; 
    } 

    @Override 
    protected <S extends GroupWithoutRelationsDto> Group dtoToModel(S dto, Group model) { 
     model.setId(dto.getId()); 
     model.setName(dto.getName()); 
     return model; 
    } 

    @Override 
    protected Group newModel() { 
     return new Group(); 
    } 

    @Override 
    protected GroupWithoutRelationsDto newDto() { 
     return new GroupWithoutRelationsDto(); 
    } 

} 

GenericDtoDao: Spring veri REST ile GroupDtoDao maruz istediğiniz Bu örnekte

@NoRepositoryBean 
public abstract class GenericDtoDao<D, M, ID extends Serializable> implements CrudRepository<D, ID> { 

    protected abstract CrudRepository<M, ID> getModelDao(); 

    protected abstract <S extends D> ID getDtoId(S dto); 

    protected abstract ID getModelId(M model); 

    protected abstract <S extends D> S modelToDto(M model, S dto); 

    protected abstract <S extends D> M dtoToModel(S dto, M model); 

    protected abstract M newModel(); 

    protected abstract D newDto(); 

    @Override 
    public D findOne(ID id) { 
     return modelToDto(getModelDao().findOne(id), newDto()); 
    } 

    @Override 
    public <S extends D> S save(S entity) { 
     Assert.notNull(entity, "The entity must not be null!"); 
     if (getDtoId(entity) == null) { 
      return create(entity); 
     } 
     return update(entity); 
    } 

    protected <S extends D> S create(S entity) { 
     Assert.notNull(entity, "The entity must not be null!"); 
     if (getDtoId(entity) != null) { 
      Assert.isTrue(!exists(getDtoId(entity)), "The entity ID must be null or not exist!"); 
     } 
     return modelToDto(getModelDao().save(dtoToModel(entity, newModel())), entity); 
    } 

    protected <S extends D> S update(S entity) { 
     Assert.notNull(entity, "The entity must not be null!"); 
     M model = getModelDao().findOne(getDtoId(entity)); 
     Assert.notNull(model, "The entity must exist!"); 
     return modelToDto(getModelDao().save(dtoToModel(entity, model)), entity); 
    } 

    // other CrudRepository methods 

} 

.

Diğer fasulyelerde hem GroupDao hem de GroupDtoDao öğelerini otomatik olarak bağlayabilirim, böylece her ikisi de Spring'in içeriği tarafından yönetilir. GroupDao, @RepositoryRestResource(exported = false) ile açıklama yapmazsam, JpaRepository REST hizmeti olarak görünür, bu nedenle, Bahar veri REST'inin iyi yapılandırılmış olduğunu varsayalım.

Özel CrudRepository'umu açığa çıkarmasını nasıl söyleyebilirim?

+0

Bunu hiç anladın mı? Ben de cevapla ilgileniyorum ama temiz bir çözüm yok. Benim en iyi düşüncem özel bir JSON ObjectMapper sağlamaktı, ve haritacı içinde DTO'yu eşleştirmek ve yerine DTO'yu yazmak. – Jay

+0

Henüz otomatik bir çözüm bulamadım, hala DtoDaos yöntemlerimi tamamlayan özel CrudRestController var –

cevap

2

Bunun nasıl yapılacağını netleştirmek için a JIRA issue var.

Şimdilik, SDR ekibi şöyle diyor: "Genelde özel serileştiricilerle bağlantı kurmak için Jackson mixins'i kullanmanız önerilir, çıktıları özelleştirin. Örneğin bir örnek için Spring RESTBucks'a bakın."

İlgili konular