2015-09-04 2 views
2

В настоящее время мы реализуем библиотеку API в нашем новейшем проекте. Мы пытаемся использовать Spring HATEOAS с HAL в качестве подходящей библиотеки для генерации ответа json hal.Именование ключей страницы Spring в HATEOAS _embedded PagedResource

Использование Spring boot 1.2.5.RELEASE + предоставленная версия Spring HATEOAS. В настоящее время мы сопоставляем фактические сущности JPA для возврата в качестве ресурсов.

I.e. наша сущность выглядит следующим образом:

import lombok.Getter; 
import lombok.Setter; 

@Getter 
@Setter 
@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    private UUID id; 

    @Column(nullable = false, length = 70) 
    private String firstName; 

    @Column(nullable = false, length = 70) 
    private String lastName; 
} 

Наше хранилище:

public interface UserRepository extends PagingAndSortingRepository<User, UUID>, JpaSpecificationExecutor<User> { 
    User findByUsername(String username); 
} 

Наша служба:

@Service 
@Transactional 
public class UserService implements UserDetailsService { 

    private UserRepository userRepository; 

    @Autowired 
    public UserService(UserRepository userRepository) { 
     this.userRepository = userRepository; 
    } 

    @Transactional 
    public Page<User> findAll(Pageable pageable) { 
     return this.userRepository.findAll(pageable); 
    } 
} 

RestController:

@RestController 
@RequestMapping(value = "/users", produces =MediaType.APPLICATION_JSON_VALUE) // this is done otherwise objectmapper returns xml for some reason 
public UserRestController { 

    public UserService userService; 
    public EntityLinks entityLinks; 

    @Autowired 
    public UserRestController(UserService userService, EntityLinks entityLinks) { 
     this.userService = userService; 
     this.entityLinks = entityLinks; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public PagedResource<Resource<User>> getUsers(Pageable pageable, PagedResourcesAssembler<User> pagedResourcesAssembler) { 
     Page<User> userPage = this.userService.findAll(pageable); 

     PagedResources<Resource<User>> userPagedResources = 
      pagedResourcesAssembler.toResource(
        usersPage, 
        linkTo(methodOn(UserRestController.class).showUsers(pageable, pagedResourcesAssembler)).withSelfRel()); 

     return userPagedResources; 

    } 
} 

Допустим, я установить страницу по умолчанию размер до 1 страниц получает роды точно. Установка ссылок на предыдущую/следующую страницу. Создается атрибут 'embeddable', но затем мы получаем «userList»: [{user}] на первой странице, а на странице 2 получаем «user $$ _ jvst163_9List»: [{user}].

Есть ли способ на самом деле назвать свойство списка страниц (я пытался найти что-то в сети, но безрезультатно).

Например:

{ 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/users{?page,size,sort}", 
     "templated": true 
    }, 
    "next": { 
     "href": "http://localhost:8080/users?page=1&size=1&sort=firstname,lastname,asc" 
    } 
    }, 
    "_embedded": { 
    "userList": [{ 
     "id": "2027bea9-cfdc-4724-b29c-39b3f64cbfd5", 
     "firstname": "admin", 
     "lastname": "asdf", 
    }] 
    }, 
    "page": { 
    "size": 1, 
    "totalElements": 2, 
    "totalPages": 2, 
    "number": 0 
    } 
} 
{ 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/users{?page,size,sort}", 
     "templated": true 
    }, 
    "prev": { 
     "href": "http://localhost:8080/users?page=0&size=1&sort=firstname,lastname,asc" 
    } 
    }, 
    "_embedded": { 
    "user_$$_jvst163_9List": [{ 
     "id": "52c0c09e-c386-4aec-9723-f8beaf99adc5", 
     "username": "admin",, 
     "firstname": "firstname", 
     "lastname": "lastname" 
    }] 
    }, 
    "page": { 
    "size": 1, 
    "totalElements": 2, 
    "totalPages": 2, 
    "number": 1 
    } 
} 
+2

Решил проблему с помощью @Relation из пакета Spring HATEOAS. То есть @Relation (collectionRelation = "users") – Konstantin

+1

не стесняйтесь отвечать на свой вопрос и предоставлять детали, чтобы сделать его полезным для других! – Raman

ответ

2

Как я понимаю, авторы собственный комментарий к вопросу, найденное решение было добавить @Relation (collectionRelation = «пользователи») к классу пользователя.

... 
@Table(name = "users") 
@Relation(collectionRelation = "users") 
public class User { 
... 
+0

Это правильно. – Konstantin

+0

Отлично! Для меня это работает как обозначение класса DTO. Спасибо ! –