2015-10-21 7 views
1

Vanilla объект пользователя -Почему Spring HATEOAS возвращает повторяющиеся ссылки, вызывающие исключение десериализации JSON?

public class User implements Serializable { 
    private static final long serialVersionUID = 262950482349139355L; 

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

    @Column(name = "FIRST_NAME", nullable = false, unique = false) 
    @Convert(converter = NameConverter.class) 
    private String firstName; 

    @Column(name = "LAST_NAME", nullable = false, unique = false) 
    @Convert(converter = NameConverter.class) 
    private String lastName; 

    @Column(name = "PHONE_NUM", nullable = false, unique = false) 
    @Convert(converter = PhoneNumberConverter.class) 
    private String phoneNum; 

    @Column(name = "EMAIL", nullable = true, unique = false) 
    @Convert(converter = OptionalStringConverter.class) 
    private Optional<String> email; 
} 

Поиск результат с именем хоста изменено в URL - 2 _links настоящего

{ 
    "_links" : { 
    "self" : { 
     "href" : "http://hostname/users/search/findByLastName?lastName=doe{&page,size,sort}", 
     "templated" : true 
    } 
    }, 
    "_embedded" : { 
    "users" : [ { 
     "firstName" : "John", 
     "lastName" : "Doe", 
     "phoneNum" : "111-111-1111", 
     "email" : null, 
     "_links" : { }, 
     "_embedded" : { }, 
     "_links" : { 
     "self" : { 
      "href" : "http://hostname/users/1", 
      "templated" : false 
     } 
     } 
    } ] 
    }, 
    "page" : { 
    "size" : 20, 
    "totalElements" : 1, 
    "totalPages" : 1, 
    "number" : 0 
    } 
} 

Edit:

Повторяющиеся ссылки нет, когда ресурс доступ к нему самостоятельно. Однако, когда клиент (микросервис в моем случае) делает запрос с использованием RestTemplate, ответ возвращается с 2 _links, как показано выше.

@Override 
public Collection<Long> getUserIdsByFirstName(String firstName) { 
    String findByFirstNameUri = UriComponentsBuilder.fromUriString(userServiceUrl) 
     .path("https://stackoverflow.com/users/search/findByFirstName").queryParam("firstName", firstName).toUriString(); 

// This is where ResponseEntity.body would have the 2 _links, if ResponseEntity<String> were used. I used a custom object to weed that out. 
ResponseEntity<UserSearchResult> userSearchResult = restTemplate.exchange(findByFirstNameUri, GET, dummyEntity, 
     UserSearchResult.class); 
    ... 
} 

Я использую данные весны JPA, данные о запасе весны, весна HATEOAS и весеннее облако. Вот link to the project на моем Github.

Полное раскрытие информации: Я подал иск на весну HATEOAS Github.

+0

Пожалуйста, покажите нам свой код, где вы собираете ресурс. Сущности и ожидаемого результата недостаточно. Мы делаем очень похожие вещи в нашем собственном программном обеспечении, и это работает. –

+0

@ThomasUhrig Я не собираю ресурс. Я использую Spring JPA для этого. Я обновил свой пост, разъяснив это и ссылку на код. –

+0

Я не хочу бродить по репозиторию GitHub, чтобы исправить ваши вещи. Отправьте соответствующий код. Сущность и результат в данном случае не актуальны. И если бы я просмотрел ваше репо - просто теоретически - я бы сказал, что вы собрали свой ресурс в своем контроллере с помощью 'PersistentEntityResourceAssembler'. Но прежде чем вы это сделаете, вы поместите ссылки вручную в 'UserSearchResult'. Итак, да, вы собираете ресурс, и вы делаете это неправильно. Так что покажите этот код. –

ответ

0

Прежде всего, вы используете пружинные данные-отдых не только spring-hateoas. Таким образом, у вас нет ресурсов и нет контроллеров. Я думаю, это было главным заблуждением здесь.

Я думаю, что у вас что-то не так с вашим пользовательским хранилищем.

Я хотел бы изменить две вещи:

  • удалить @Repository из UserRepositoryCustomImpl
  • делают UserRepository продлить UserRepositoryCustom

так

public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom 

и

public class UserRepositoryCustomImpl implements UserRepositoryCustom 

Это то, что вам нужно для того, чтобы реализовать пользовательский репозиторий методов:

смотри также http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-implementations

+0

Я не использую 'UserRepositoryCustom', я сначала начал игру с идеей, но не использовал ее. 'UserRepository' просто расширяет' JpaRepository' 'public interface UserRepository расширяет JpaRepository {...}' –

+1

Я подтверждаю, что 'UserRepositoryCustom' не имеет отношения к этой проблеме (путем удаления' UserRepositoryCustom'). Я добавил дополнительную информацию к своему сообщению. –

Смежные вопросы