Начиная с Jersey 2.9, было возможно создать связи для гиперссылок REST API через декларативную привязку.
Этот код, например:
@InjectLink(
resource = ItemResource.class,
style = Style.ABSOLUTE,
bindings = @Binding(name = "id", value = "${instance.id}"),
rel = "self"
)
@XmlJavaTypeAdapter(Link.JaxbAdapter.class)
@XmlElement(name="link")
Link self;
... в теории, как ожидается, будет генерировать JSON следующим образом:
"link" : {
"rel" : "self",
"href" : "http://localhost/api/resource/1"
}
Однако Джерси производит разные JSON с множеством свойств, которые мне не нужны:
"link" : {
"rel" : "self",
"uri" : "http://localhost/api/resource/1",
"type": null,
"uriBuilder" : null
}
Обратите внимание также, что вместо href
он использует uri
. Я посмотрел на реализацию Джерси объекта Link
и нашел JerseyLink
.
Я хочу использовать декларативную ссылку на Джерси вместо того, чтобы внедрять мою собственную реализацию. Я закончил использование аннотаций Джексона, чтобы игнорировать другие свойства JerseyLink
.
@JsonIgnoreProperties({ "uriBuilder", "params", "type", "rels" })
Кто-нибудь использовал декларативную связь с Джерси и имел ожидаемый вывод JSON (например, href
вместо uri
, без дополнительных свойств Джерси) без необходимости использовать JsonIgnoreProperties
или другие хаки?
Спасибо.
ИЗМЕНИТЬ
Я решил это, используя подход, который, я думаю, взломан, но хорошо работает для меня и не требует использования сложного адаптера.
Я понял, что могу фактически выставить другой объект вместо ссылки, введенной Джерси.
Я создал объект-оболочку с именем ResourceLink:
public class ResourceLink {
private String rel;
private URI href;
//getters and setters
}
Тогда в моем объекте представления у меня есть метод getter:
public ResourceLink getLink() {
ResourceLink link = new ResourceLink();
link.setRel(self.getRel());
link.setHref(self.getUri());
return link;
}
Итак, я использовал Джерси, чтобы ввести ссылку, но возвратил другой объект в методе getter в моем объекте представления. Это будет свойство, которое будет сериализовано для JSON, а не для объекта с вложенными ссылками, потому что я не создал для него метод getter.