gpt4 book ai didi

java - 如何使用 Spring 数据 REST 公开自定义 DTO crud 存储库?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:07 25 4
gpt4 key购买 nike

我不想公开我的模型类(jpa 实体),而是公开它们具有不同数据传输对象 (DTO) 的属性的不同子集。这个想法是DTO CrudRepository <-> JpaRepository <-> entities ,我想通过 Spring Data REST 公开 DTO CrudRepository .

例子:

实体:

@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> {
}

实现:

@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:

@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

}

在此示例中,我想使用 Spring 数据 REST 公开 GroupDtoDao。

在其他 bean 中,我可以 Autowiring GroupDao 和 GroupDtoDao,因此两者都由 Spring 的上下文管理。如果我不注释 GroupDao@RepositoryRestResource(exported = false) JpaRepository 公开为 REST 服务,因此我认为 Spring 数据 REST 配置良好。

我如何告诉它公开我的自定义 CrudRepository?

最佳答案

a JIRA issue阐明如何做到这一点。

目前,SDR 团队表示“我们通常建议仅使用 Jackson mixin 来挂接自定义序列化程序、自定义输出等。有关示例,请参见 Spring RESTBucks。”

关于java - 如何使用 Spring 数据 REST 公开自定义 DTO crud 存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28428573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com