как ввести заголовки etag и version с абстракцией остатка данных spring

Привет, я использую весенний отдых данных с Jpa в своем проекте, чтобы выставить остальные веб-сервисы на основе HAL. Он хорошо работает для большинства моих случаев, и для дальнейшей настройки я использую дополнительные контроллеры и вызываю репозитории данных Spring, чтобы получить данные для меня и использовать ресурс hatos для отображения тех, ссылки на которые выставлены через entityLinks ненависти. Это здорово и работает для большинства моих случаев использования. Теперь у меня есть несколько дополнительных требований, в которых я хочу поместить заголовки etag для кэширования сервера и заголовки ссылок версии уровня экземпляра [https://tools.ietf.org/html/rfc5988] более конкретно https://tools.ietf.org/html/rfc5829#page-3, как показано ниже для моих ответов.

ПОЛУЧИТЬ /81822 HTTP/1.1...

HTTP/1.1 OK
Host: dumbserver.com
Content-Type: application/json
Link: </81822 ;v=1.1>; rel="previous";
       </81822 >; rel="current";
       </81822 /version-history>; rel="version-history";

{

Возможно ли это с помощью интерфейсов ненавистников или мне придется использовать собственный подход, добавив их через HttpServletResponse или responseentity.getHeaader и добавив собственный код для обработки версий. Я думаю, что Spring data rest или hatos также должны работать над предоставлением абстракций для них. .


person Gaurav Rawat    schedule 15.06.2015    source источник


Ответы (1)


Я думаю, что вам в значительной степени придется сворачивать свои собственные, как только вы переопределяете конечную точку Spring Data Rest с контроллера, даже если ваш контроллер помечен @RepositoryRestController.

Мы сделали это, создав базовый контроллер, который отвечает за перенос нашего entity в Resource, который, в свою очередь, заворачивается в ResponseEntity.

Наш ETag основан на объекте versionNumber, который имеет аннотацию @Version.

protected ResponseEntity<Resource<T>> createResponse(T entity, 
                   PersistentEntityResourceAssembler assembler) 
{
    def bb = ResponseEntity.ok()
    bb.eTag(ETag.from("${entity.versionNumber}").toString())
    return bb.body(createResource(entity, assembler))
}

protected Resource<T> createResource(T entity, ResourceAssembler assembler) {
    def resource = resourceCreator.toResource(assembler, entity)
    resource.add(buildSelfLink(resource))
    resource
}

Link buildSelfLink(Resource<T> resource) {
    linkBuilder.buildSelfLinkWithId(this.class, resource.content.id)
}

Link prependLinkWithApiBase(ControllerLinkBuilder linkBuilder) {
    URI uri = linkBuilder.toUri()
    String origPath = uri.rawPath
    String newPath = "$API_BASE$origPath"
    log.debug("Replacing {} with {}", origPath, newPath)
    def uriBuilder = UriComponentsBuilder.fromUri(uri).replacePath(newPath)
    new Link(uriBuilder.toUriString())
}

Link buildSelfLinkWithId(Class c, def id) {
    /*
        When trying to use `methodOn` to properly build 
        the self URI, we ran into this. 
        Going the dumb route instead.

        java.lang.ClassCastException: 
          Cannot cast com.MyEntity$$EnhancerByCGLIB$$a1654b7b
        to com.MyEntity
        at java.lang.Class.cast(Class.java:3369) ~[na:1.8.0_92]
        at org.sfw.hateoas.core.DummyInvocationUtils
            $InvocationRecordingMethodInterceptor.intercept(DummyInvocationUtils.java:100)
            ~[spring-hateoas-0.20.0.RELEASE.jar:na]
     */

    //Due to https://github.com/spring-projects/spring-hateoas/issues/434 we have hoops to jump
    def linkBuilder = linkTo(c).slash(id)
    prependLinkWithApiBase(linkBuilder)
}
person Snekse    schedule 13.01.2017