2016-12-03 3 views
1

나는 같은 개체에 추가 링크를 추가 할 :스프링 데이터 나머지를 사용하여 엔티티에 새 _link를 추가하는 방법은 무엇입니까? 나는 다음과 같은 문제에 직면하고있어

"_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

는 어떻게이 올바른 방법으로 달성 할 수있는 사람을 알고 있습니까? 아니면 컨트롤러를 만드는 유일한 대안입니까?

고맙습니다.

참고 : 나는 마침내 그것을 알아 냈

, 내가 (감사합니다) 아래의 코멘트에 알렉스가 무엇을 언급했다. 먼저 다음과 같은 구성 요소를 생성 restbucks

1)

:

가 BTW 내가 더 정확한 자신의 예 중 하나를 선택 @olivergieke하는 스프링 데이터 나머지의 아버지에게 신용을 제공 한

@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); 
} 

} 

을 두 동작을 지원하기 위해 컨트롤러를 생성하고 그것을이었다.

감사합니다.

+0

정확히 무엇이 문제입니까? – zeroflagL

답변

1

당신은 단지 ResourceProcessor 인터페이스를 확장하는 클래스를 추가하고 사람의 실체가 Organizacion 엔티티로 대체 할 수있다 예를

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

를 들어 스프링 컨텍스트 (http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_the_resourceprocessor_interface) 에 추가해야합니다.

+1

안녕하세요 Alex Ciocan 저는 실제로 y'day를 알아 냈습니다. 그러나 여기에 실제로 코멘트를 추가하는 것을 잊어 버렸습니다. 실제로 제가 한 일입니다. 감사합니다. 당신의 의견에 감사드립니다. –