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.
Пожалуйста, покажите нам свой код, где вы собираете ресурс. Сущности и ожидаемого результата недостаточно. Мы делаем очень похожие вещи в нашем собственном программном обеспечении, и это работает. –
@ThomasUhrig Я не собираю ресурс. Я использую Spring JPA для этого. Я обновил свой пост, разъяснив это и ссылку на код. –
Я не хочу бродить по репозиторию GitHub, чтобы исправить ваши вещи. Отправьте соответствующий код. Сущность и результат в данном случае не актуальны. И если бы я просмотрел ваше репо - просто теоретически - я бы сказал, что вы собрали свой ресурс в своем контроллере с помощью 'PersistentEntityResourceAssembler'. Но прежде чем вы это сделаете, вы поместите ссылки вручную в 'UserSearchResult'. Итак, да, вы собираете ресурс, и вы делаете это неправильно. Так что покажите этот код. –