【发布时间】:2016-12-03 18:43:49
【问题描述】:
我面临以下挑战,我想为实体添加额外链接,例如:
"_links": {
"self": {
"href": "http://localhost:8080/api/organizaciones"
},
"profile": {
"href": "http://localhost:8080/api/profile/organizaciones"
},
"search": {
"href": "http://localhost:8080/api/organizaciones/search"
},
"disable": {
"href": "http://localhost:8080/api/organizaciones/disable"
}
}
这种情况背后的想法是,我需要通过 Organizacion 实体中自己的链接公开软删除......现在我只能这样做:
http://localhost:8080/api/organizaciones/search/disable?id=100
为了执行软删除...有谁知道我怎样才能以正确的方式实现这一目标?或者它是我创建控制器的唯一选择?
在此致谢。
注意:
我终于想通了,我做了亚历克斯在下面的评论中提到的(谢谢)。
顺便说一句,我必须将 spring-data-rest 之父归功于@olivergieke 我检查了他的一个例子,更准确地说:restbucks
1.) 首先创建如下组件
@Component
@RequiredArgsConstructor
public class OrganizacionResourceProcessor implements ResourceProcessor<Resource<Organizacion>>{
private static final String DISABLE_REL = "deshabilitar";
private static final String ENABLE_REL = "habilitar";
private final @NonNull EntityLinks entityLinks;
@Override
public Resource<Organizacion> process(Resource<Organizacion> resource) {
Organizacion organizacion = resource.getContent();
if(organizacion.isEnabled()){
resource.add(entityLinks.linkForSingleResource(Organizacion.class, organizacion.getId()).slash(DISABLE_REL).withRel(DISABLE_REL));
}
if(organizacion.isDisabled()){
resource.add(entityLinks.linkForSingleResource(Organizacion.class, organizacion.getId()).slash(ENABLE_REL).withRel(ENABLE_REL));
}
return resource;
}
}
然后创建控制器来支持这两个操作...
@RepositoryRestController
@RequestMapping("/organizaciones")
@ExposesResourceFor(Organizacion.class)
@RequiredArgsConstructor
@Slf4j
@Transactional
public class OrganizacionController {
private final @NonNull OrganizacionRepository organizacionRepository;
private final @NonNull EntityLinks entityLinks;
@GetMapping(value="/{id}/habilitar")
public ResponseEntity<?> desactivarOrganizacion(@PathVariable("id") Long id) {
Preconditions.checkNotNull(id);
Organizacion organizacion = organizacionRepository.findOne(id);
if(organizacion == null){
return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
}
organizacion.setEstado(Estado.DESHABILITADO);
Organizacion pOrg = this.organizacionRepository.save(organizacion);
HttpHeaders header = new HttpHeaders();
header.setLocation(this.entityLinks.linkForSingleResource(Organizacion.class, pOrg.getId()).toUri());//construimos el URL
return new ResponseEntity<Void>(header,HttpStatus.CREATED);
}
@GetMapping(value="/{id}/deshabilitar")
public ResponseEntity<?> activarOrganizacion(@PathVariable("id") Long id){
Preconditions.checkNotNull(id);
Organizacion organizacion = organizacionRepository.findOne(id);
if(organizacion == null){
return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
}
organizacion.setEstado(Estado.ACTIVO);
Organizacion pOrg = this.organizacionRepository.save(organizacion);
HttpHeaders header = new HttpHeaders();
header.setLocation(this.entityLinks.linkForSingleResource(Organizacion.class, pOrg.getId()).toUri());//construimos el URL
return new ResponseEntity<Void>(header,HttpStatus.CREATED);
}
}
就是这样。
谢谢各位。
【问题讨论】:
标签: spring rest api spring-data-rest spring-hateoas