【问题标题】:How add a new _link to an entity using spring data rest?如何使用弹簧数据休息向实体添加新的_link?
【发布时间】: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


    【解决方案1】:

    你只需要添加一个扩展 ResourceProcessor 接口的类并将其添加到 spring-context(http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_the_resourceprocessor_interface) 例如

    @Bean
    public ResourceProcessor<Resource<Person>> personProcessor() {
    
       return new ResourceProcessor<Resource<Person>>() {
    
         @Override
         public Resource<Person> process(Resource<Person> resource) {
    
          resource.add(new Link("http://localhost:8080/people", "added-link"));
          return resource;
         }
       };
    }
    

    Person 实体可以替换为您的 Organizacion 实体。

    【讨论】:

      猜你喜欢
      • 2017-11-06
      • 2014-03-28
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2017-12-08
      相关资源
      最近更新 更多