_Links canônicos com mola HATEOAS

Estamos criando um serviço da web RESTful semelhante ao guia spring.io "Acessando dados JPA com REST". Para reproduzir as saídas de amostra abaixo, basta adicionar umManyToOne-Relação aPessoa do seguinte modo:

// ...

@Entity
public class Person {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  private String firstName;
  private String lastName;

  @ManyToOne
  private Person father;

  // getters and setters
}

Uma solicitação GET após adicionar alguns dados de amostra gera:

{
  "firstName" : "Paul",
  "lastName" : "Mustermann",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/people/1"
    },
    "father" : {
      "href" : "http://localhost:8080/people/1/father"
    }
  }
}

Mas, como o pai de Paulo está armazenado com o ID 2, nosso resultado desejado seria o URL canônico para sua relação:

// ...
    "father" : {
      "href" : "http://localhost:8080/people/2"
    }
// ...

Obviamente, isso causará problemas sepai é nulo em algumas pessoas (OK, isso não faz muito sentido aqui ...;)), mas, neste caso, gostaríamos de não renderizar o link no JSON.

Já tentamos implementar umResourceProcessor para conseguir isso, mas parece que quando o processador é chamado, os links ainda não estão preenchidos. Conseguimos adicionar links adicionais apontando para o URL canônico desejado, mas não conseguimos modificar os links adicionados de alguma forma mais tarde.

Pergunta, questão: Existe uma abordagem genérica para personalizar a geração de links para todos os recursos?

Para esclarecer nossa necessidade de URLs canônicos: Usamos a estrutura Javascript SproutCore para acessar o serviço web RESTful. Ele usa uma abstração "semelhante a ORM" de fontes de dados para as quais implementamos um manipulador genérico da saída JSON que Spring produz. Ao consultar todas as pessoas, precisaríamos enviar n * (1 + q) solicitações (em vez de apenas n) para n pessoas com q relações com outras pessoas para sincronizá-las com a fonte de dados do lado do cliente. Isso ocorre porque o link "não-canônico" padrão não contém absolutamente nenhuma informação sobre um pai sendo definido ou o ID do pai. Parece que isso causa uma enorme quantidade de solicitações desnecessárias que poderiam ser facilmente evitadas se a resposta inicial contivesse um pouco mais de informações em primeiro lugar.

Outra solução seria adicionar o ID do pai à relação, por exemplo:

"father" : {
  "href" : "http://localhost:8080/people/1/father",
  "id" : 2
}

questionAnswers(3)

yourAnswerToTheQuestion